Java 在TestNG的单元测试中,当使用mokito存根函数时,总是报告nullPointerException,我没有找到解决方案
这是一个基于gradle的springmvc项目,我正在使用TestNG对其进行单元测试。当我模拟服务层类并存根其方法时,“Java 在TestNG的单元测试中,当使用mokito存根函数时,总是报告nullPointerException,我没有找到解决方案,java,mockito,testng,Java,Mockito,Testng,这是一个基于gradle的springmvc项目,我正在使用TestNG对其进行单元测试。当我模拟服务层类并存根其方法时,“When().ThenReturn()”不断报告NullPointerException,我在这个站点上尝试了许多不适合我的解决方案 控制器: package app.dnatask.controller; import ... @Slf4j @RestController @RequestMapping(value = "/API/scanresultconfigur
When().ThenReturn()
”不断报告NullPointerException,我在这个站点上尝试了许多不适合我的解决方案
控制器:
package app.dnatask.controller;
import ...
@Slf4j
@RestController
@RequestMapping(value = "/API/scanresultconfigure")
public class ScanResultConfigureController extends BaseController {
@Autowired
private ScanResultConfigureService scanResultConfigureService;
@RequestMapping(value = "/queryScanResultList/{taskId}/{externalname}", method = RequestMethod.POST)
public IBaseResult queryscanResultList(final HttpServletRequest request, @PathVariable final String taskId, @PathVariable final String externalname, @RequestBody Map map) throws Exception {
return runController(new IControllRunner() {
public void run(IOutResult or, CheckResult cr) throws Exception {
List<ScanResultTitleConfigurePO> list = scanResultConfigureService.findtitleConfigure(taskId, externalname, map);
......
}
}
}
}
这个问题困扰了我很多天。。。我真的需要你的帮助。出现
NullpointerException
的原因可能是scanResultConfigureService.findtitleConfigure(anyString(),anyString(),anyMap())
正在返回null或findtitleConfigure
中的任何中间方法,因为它在使用之前没有被存根
您可以为所有中间返回值创建模拟,并在使用前将其存根。比如说
FindTitleConfigure findTitleConfigure = mock(FindTitleConfigure.class);
NullpointerException
的原因可能是scanResultConfigureService.findtitleConfigure(anyString(),anyString(),anyMap())
正在返回null或findtitleConfigure
中的任何中间方法,因为它在使用前未被存根
您可以为所有中间返回值创建模拟,并在使用前将其存根。比如说
FindTitleConfigure findTitleConfigure = mock(FindTitleConfigure.class);
在单元测试类上方添加注释将解决此问题:
@TestExecutionListeners(listeners=MockitoTestExecutionListener.class)
在单元测试的类上方添加注释将解决此问题:
@TestExecutionListeners(listeners=MockitoTestExecutionListener.class)
我尝试了@MockBean(answer=Answers.RETURNS\u SMART\u NULLS)
或@MockBean
但仍然无法解决我的问题。错误位置在单元测试中:when(scanResultConfigureService.findtitleConfigure(anyString(),anyString()),anyMap())。然后返回(testList)代码>查看此示例以更清楚地了解我的解决方案:我想问一个问题:控制器的单元测试只是使用mockmvc的测试,对吗?是的,它只是一个扩展。我尝试了@MockBean(答案=答案。返回\u SMART\u null)
或@MockBean
仍然无法解决我的问题。错误位置在单元测试中:当(scanResultConfigureService.findtitleConfigure(anyString(),anyString(),anyMap())。然后返回(testList)代码>查看此示例以了解我的解决方案:我想问一个问题:控制器的单元测试只是使用mockmvc的测试,对吗?是的,它只是一个扩展。根据您的提醒,我认为这是因为泛型。因为findtitleConfigure返回了列表
;和when()。然后返回
返回
列表
。但是当我删除泛型时,它仍然报告了NullPointerException
。您需要模拟findtitleConfigure
以返回一个列表,然后使用它。我已经尝试了您上面提到的解决方案,但我的findtitleConfigure没有中间返回值。此方法直接返回一个列表。在spring项目中,我只能用@MockBean来模拟服务类。哦,我想我发现了哪里出了问题。您的意思是中间返回指的是服务中的数据库查找方法吗?在我模拟了ScanResultitleConfigureRepository
之后,单元测试通过了。我甚至不需要在服务上存根findtitleConfigure
方法。根据您的提醒,我认为这是因为泛型。因为findtitleConfigure返回了列表
;和when()。然后返回
返回列表。但是当我删除泛型时,它仍然报告了NullPointerException
。您需要模拟findtitleConfigure
以返回一个列表,然后使用它。我已经尝试了您上面提到的解决方案,但我的findtitleConfigure没有中间返回值。此方法直接返回一个列表。在spring项目中,我只能用@MockBean来模拟服务类。哦,我想我发现了哪里出了问题。您的意思是中间返回指的是服务中的数据库查找方法吗?在我模拟了ScanResultitleConfigureRepository
之后,单元测试通过了。我甚至不需要在服务上存根findtitleConfigure
方法。
java.lang.NullPointerException
at app.dnatask.controller.ScanResultConfigureControllerTest.testQueryscanResultList(ScanResultConfigureControllerTest.java:109)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:239)
at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.run(AbstractTestNGSpringContextTests.java:180)
at org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:251)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:580)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:172)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:804)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.testng.TestRunner.privateRun(TestRunner.java:770)
at org.testng.TestRunner.run(TestRunner.java:591)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
at org.testng.SuiteRunner.run(SuiteRunner.java:304)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
at org.testng.TestNG.runSuites(TestNG.java:1032)
at org.testng.TestNG.run(TestNG.java:1000)
at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.runTests(TestNGTestClassProcessor.java:139)
at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.stop(TestNGTestClassProcessor.java:89)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy1.stop(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:123)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:748)
FindTitleConfigure findTitleConfigure = mock(FindTitleConfigure.class);