lhotari opened a new pull request #13621:
URL: https://github.com/apache/pulsar/pull/13621


   Fixes #13620 
   
   ### Motivation
   
   Mockito spy creation fails sporadically and causes an exception and Mockito 
misuse warning:
   
   [example 
failure](https://github.com/apache/pulsar/runs/4711466595?check_suite_focus=true#step:9:1418)
   
   ```
   Error:  Tests run: 83, Failures: 22, Errors: 0, Skipped: 41, Time elapsed: 
13.054 s <<< FAILURE! - in 
org.apache.pulsar.broker.service.persistent.PersistentTopicStreamingDispatcherTest
   Error:  
setup(org.apache.pulsar.broker.service.persistent.PersistentTopicStreamingDispatcherTest)
  Time elapsed: 0.088 s  <<< FAILURE!
   org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
   
   BrokerService$MockitoMock$967912326 cannot be returned by 
getPulsarResources()
   getPulsarResources() should return PulsarResources
   ***
   If you're unsure why you're getting above error read on.
   Due to the nature of the syntax above problem might occur because:
   1. This exception *might* occur in wrongly written multi-threaded tests.
      Please refer to Mockito FAQ on limitations of concurrency testing.
   2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub 
spies - 
      - with doReturn|Throw() family of methods. More in javadocs for 
Mockito.spy() method.
   
        at 
org.apache.pulsar.broker.service.PersistentTopicTest.setup(PersistentTopicTest.java:209)
        at 
org.apache.pulsar.broker.service.persistent.PersistentTopicStreamingDispatcherTest.setup(PersistentTopicStreamingDispatcherTest.java:34)
        at 
org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:132)
        at 
org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:61)
        at 
org.testng.internal.ConfigInvoker.invokeConfigurationMethod(ConfigInvoker.java:366)
        at 
org.testng.internal.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:320)
        at 
org.testng.internal.TestInvoker.runConfigMethods(TestInvoker.java:701)
        at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:527)
        at 
org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:174)
        at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
        at 
org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:822)
        at 
org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147)
        at 
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
        at org.testng.TestRunner.privateRun(TestRunner.java:764)
        at org.testng.TestRunner.run(TestRunner.java:585)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
        at org.testng.SuiteRunner.run(SuiteRunner.java:286)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
        at org.testng.TestNG.runSuites(TestNG.java:1069)
        at org.testng.TestNG.run(TestNG.java:1037)
        at 
org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:135)
        at 
org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeSingleClass(TestNGDirectoryTestSuite.java:112)
        at 
org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeLazy(TestNGDirectoryTestSuite.java:123)
        at 
org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:90)
        at 
org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:146)
        at 
org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384)
        at 
org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345)
        at 
org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126)
        at 
org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418)
   ```
   
   ### Additional context
   
   The exception message gives this hint:
   ```
   If you're unsure why you're getting above error read on.
   Due to the nature of the syntax above problem might occur because:
   1. This exception *might* occur in wrongly written multi-threaded tests.
      Please refer to Mockito FAQ on limitations of concurrency testing.
   2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub 
spies - 
      - with doReturn|Throw() family of methods. More in javadocs for 
Mockito.spy() method.
   ```
   the `doReturn` family of methods is already used so it must be some other 
problem. 
   
   The assumption of the solution in this PR is that when an instance spy is 
replaced with a mock that internally creates the spy instance using the given 
class and constructor arguments would solve the issue. 
   
   ### Modifications
   
   - add the following utility method for creating spies with the given class 
and constructor arguments:
   ```java
   public static <T> T spyWithClassAndConstructorArgs(Class<T> classToSpy, 
Object... args) {
       return Mockito.mock(classToSpy, Mockito.withSettings()
               .useConstructor(args)
               .defaultAnswer(Mockito.CALLS_REAL_METHODS));
   }
   ```
   - replace spy creation the pulsar-broker tests with the usage of 
`spyWithClassAndConstructorArgs`


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to