设置如下:
@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。
以前有人经历过这种情况吗?设置错了吗?有什么办法绕过它?
编辑:模拟的注解是@MockBean
。addAddress()
的返回类型是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)
1条答案
按热度按时间bis0qfac1#
通过这种构造,您的
thenThrow
设置确实调用了mock上的方法,而不是设置它。您可以使用替代的模拟设置来修复此问题,例如(为了便于阅读,示例不完整):
在我自己的一个项目中验证了这一点。
如果Mockito随后抱怨这个mocking构造被认为是不必要的(在
any
上有一个匹配器,在argThat
上有一个特定的匹配器),你可以在启用lenient
的情况下设置它:从https://www.baeldung.com/mockito-unnecessary-stubbing-exception开始
这基本上是因为在你的
@BeforeEach
中你设置了一个通用的答案,而在特定的测试postFullAccidentReport_firstWitnessAddressStreetNumberMissing
中你希望它抛出一个Exception
。所以第一个设置实际上并没有在这个测试方法中使用。我猜想您有其他使用通用设置的测试方法,但是对于每种方法来说,正确的设置都是
cleaner
。