Java 在TestNG的单元测试中,当使用mokito存根函数时,总是报告nullPointerException,我没有找到解决方案

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

这是一个基于gradle的springmvc项目,我正在使用TestNG对其进行单元测试。当我模拟服务层类并存根其方法时,“
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);