当Mockito.()被调用时,Mockito调用它的mock?

1l5u6lss  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(113)

设置如下:

@BeforeEach
void setUp() {
  mockAddressClient();
}

private void mockAddressClient() {
  Mockito
    .when(addressClient.addAddress(Mockito.any()))
    .thenAnswer(
      in -> {
        de.vbg.suvi.api.address.v1.model.Address adr = in.getArgument(0);
        de.vbg.suvi.api.address.v1.model.ValueAddress values = adr.getValues();
        AddressResponse addressResponse =
          new AddressResponse()
            .id(UUID.randomUUID())
            .streetLine1(values.getStreetLine1())
            .streetLine2(values.getStreetLine2())
            .streetNumber(values.getStreetNumber())
            .zipCode(values.getZipCode())
            .city(values.getCity())
            .country(values.getCountry());
        addresses.put(addressResponse.getId(), addressResponse);
        return new ResponseEntity<>(addressResponse, HttpStatus.CREATED);
    });
}

@Test
void postFullAccidentReport_firstWitnessAddressStreetNumberMissing() {
  /*
   * Given
   */
  final String placeId = UUID.randomUUID().toString();
  AccidentReport accidentReport = createFullAccidentReport();
  accidentReport.getFirstWitness().getPerson().getAddress().setPlaceId(placeId);
  accidentReport.getFirstWitness().getPerson().getAddress().setValues(null);
  Mockito.when(addressClient.addAddress(Mockito.argThat(a -> a.getPlaceId().equals(placeId))))
    .thenThrow(
      new ValidationException(
        List.of(
          new SuviFieldValidationError(
            ViolationCode.INVALID, "message", "streetNumber"))));

  /*
   * When
   */
  ResponseEntity<ValidationProblem> response =
    postAccidentReport(accidentReport, ValidationProblem.class);

  /*
   * Then
   */
  Assertions.assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode());
  Assertions.assertNotNull(response.getBody());
  ValidationProblem validationProblem = response.getBody();
  FieldViolation fieldViolation = validationProblem.getViolations().get(0);
  Assertions.assertEquals(
    "firstWitness.person.address.placeId.streetNumber", fieldViolation.getField());
}

现在,当我运行我的测试时,我在adr.getValues()上的mockAddressClient()方法中收到了一个NullPointerException。检查调用跟踪,看起来好像NPE在我的测试方法中的Mockito.when()行上抛出。好像Mockito正在调用它自己的mock。
以前有人经历过这种情况吗?设置错了吗?有什么办法绕过它?
编辑:模拟的注解是@MockBeanaddAddress()的返回类型是ResponseEntity<AddressResponse>

java.lang.NullPointerException
   at de.vbg.suvi.claim.api.ClaimControllerTest.lambda$mockAddressClient$18(ClaimControllerTest.java:2308 undefined)
   at org.mockito.internal.stubbing.StubbedInvocationMatcher.answer(StubbedInvocationMatcher.java:40 undefined)
   at org.mockito.internalr.MockHandlerImpl.handle.handle(MockHandlerImpl.java:99 undefined)
   at org.mockito.internalr.NullResultGuardian.handle.handle(NullResultGuardian.java:29 undefined)
   at org.mockito.internalr.InvocationNotifierHandler.handle.handle(InvocationNotifierHandler.java:33 undefined)
   at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:82 undefined)
   at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:56 undefined)
   at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor$DispatcherDefaultingToRealMethod.interceptAbstract(MockMethodInterceptor.java:157 undefined)
   at de.vbg.suvi.claim.clients.AddressClient$MockitoMock$2090955218.addAddress(Unknown Source)
   at de.vbg.suvi.claim.api.ClaimControllerTest.postFullAccidentReport_firstWitnessAddressStreetNumberMissing(ClaimControllerTest.java:825 undefined)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62 undefined)
   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43 undefined)
   at java.base/java.lang.reflect.Method.invoke(Method.java:564 undefined)
   at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688 undefined)
   at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60 undefined)
   at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131 undefined)
   at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149 undefined)
   at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140 undefined)
   at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84 undefined)
   at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115 undefined)
   at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105 undefined)
   at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106 undefined)
   at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64 undefined)
   at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45 undefined)
   at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37 undefined)
   at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104 undefined)
   at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98 undefined)
   at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210 undefined)
   at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73 undefined)
   at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206 undefined)
   at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131 undefined)
   at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139 undefined)
   at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129 undefined)
   at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127 undefined)
   at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84 undefined)
   at java.base/java.util.ArrayList.forEach(ArrayList.java:1511 undefined)
   at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143 undefined)
   at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129 undefined)
   at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127 undefined)
   at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84 undefined)
   at java.base/java.util.ArrayList.forEach(ArrayList.java:1511 undefined)
   at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143 undefined)
   at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129 undefined)
   at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127 undefined)
   at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126 undefined)
   at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84 undefined)
   at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32 undefined)
   at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57 undefined)
   at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51 undefined)
   at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108 undefined)
   at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88 undefined)
   at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54 undefined)
   at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67 undefined)
   at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52 undefined)
   at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96 undefined)
   at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75 undefined)
   at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99 undefined)
   at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79 undefined)
   at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75 undefined)
   at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61 undefined)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62 undefined)
   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43 undefined)
   at java.base/java.lang.reflect.Method.invoke(Method.java:564 undefined)
   at org.gradle.internal.ReflectionDispatch.dispatch.dispatch(ReflectionDispatch.java:36 undefined)
   at org.gradle.internal.ReflectionDispatch.dispatch.dispatch(ReflectionDispatch.java:24 undefined)
   at org.gradle.internal.ContextClassLoaderDispatch.dispatch.dispatch(ContextClassLoaderDispatch.java:33 undefined)
   at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94 undefined)
   at com.sun.proxy.$Proxy5.stop(Unknown Source)
   at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133 undefined)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62 undefined)
   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43 undefined)
   at java.base/java.lang.reflect.Method.invoke(Method.java:564 undefined)
   at org.gradle.internal.ReflectionDispatch.dispatch.dispatch(ReflectionDispatch.java:36 undefined)
   at org.gradle.internal.ReflectionDispatch.dispatch.dispatch(ReflectionDispatch.java:24 undefined)
   at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182 undefined)
   at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164 undefined)
   at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414 undefined)
   at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64 undefined)
   at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48 undefined)
   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130 undefined)
   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630 undefined)
   at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56 undefined)
   at java.base/java.lang.Thread.run(Thread.java:832 undefined)
bis0qfac

bis0qfac1#

通过这种构造,您的thenThrow设置确实调用了mock上的方法,而不是设置它。
您可以使用替代的模拟设置来修复此问题,例如(为了便于阅读,示例不完整):

Mockito.doThrow(myException).when(addressClient).addAddress(matchers)

在我自己的一个项目中验证了这一点。
如果Mockito随后抱怨这个mocking构造被认为是不必要的(在any上有一个匹配器,在argThat上有一个特定的匹配器),你可以在启用lenient的情况下设置它:

Mockito.lenient().doThrow(myException).when(addressClient).addAddress(matchers)

https://www.baeldung.com/mockito-unnecessary-stubbing-exception开始
这基本上是因为在你的@BeforeEach中你设置了一个通用的答案,而在特定的测试postFullAccidentReport_firstWitnessAddressStreetNumberMissing中你希望它抛出一个Exception。所以第一个设置实际上并没有在这个测试方法中使用。
我猜想您有其他使用通用设置的测试方法,但是对于每种方法来说,正确的设置都是cleaner

相关问题