当前位置: 首页 > 知识库问答 >
问题:

MockMvc peform在集成测试中返回nullPointerException

卓宏达
2023-03-14

我正在尝试为我的Spring项目运行集成测试,它是一个简单的get方法,用于从DB返回给定id的字符串输出。但是在Mockmvc中,我一直在Mockmvc上得到一个NullPointerException。在我的测试范围内执行。

以下是测试:

@WebMvcTest(OutputController.class)
public class OutputControllerTests {

    @Autowired
    private MockMvc mockMvc;

    @MockBea
    OutputService outputService;

    @Test
    public void returnOutputForValidId() throws Exception {
        OutputService service = Mockito.mock(OutputService.class);
        when(service.findOutputById("TEST")).thenReturn("Test output");

        String getOutputMapping = "/output/{systemID}";
        String id = "TEST";

        mockMvc.perform(get(getOuputMapping, id))
                .andDo(print()).andExpect(status().isOk())
                .andExpect(content().string("Test output"));
    }

这里是控制器-输出控制器:

@RestController
public class OutputController {

    private final OutputService outputService;

    public OutputController(OutputService outputService) {
        this.outputService = outputService;
    }


    @GetMapping("/output/{id}")
    @CrossOrigin
    public String getOutputByID(@PathVariable String Id) {


        String output = outputService.findOutputById(Id);

        return output;
    }
}

完全错误是:

java.lang.NullPointerException
    at .com.output.OutputControllerTests.returnOutputForValidId(OutputControllerTests.java:37)
    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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

共有1个答案

郭翰翮
2023-03-14

您不需要自动连接MockMvc对象。请尝试以下方法:

java prettyprint-override">import org.junit.jupiter.api.BeforeEach;
//...
private MockMvc mockMvc;
//...

@BeforeEach
public void setUp(WebApplicationContext context) {
   mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}

 类似资料:
  • 英文原文:http://emberjs.com/guides/testing/integration/ 集成测试通常用来测试应用中得重要工作流。集成测试用来模拟用户交互和确认交互结果。 设置 为了对Ember应用进行集成测试,需要在测试框架中运行应用。首先需要将根元素(root element)设置为任意一个已知将存在的元素。如果根元素在测试运行时可见的话,这对测试驱动开发非常有用,带来的帮助非常

  • 主要内容:集成测试背后的原因,集成测试技术,集成测试方法,集成测试指南集成测试是单元测试后软件测试过程的第二个层次。在此测试中,软件的单元或单个组件在组中进行测试。集成测试级别的重点是在集成组件或单元之间交互时暴露缺陷。 单元测试使用模块进行测试,这些模块在集成测试中进行组合和测试。该软件使用许多软件模块开发,这些软件模块由不同的编码器或程序员编码。集成测试的目标是检查所有模块之间通信的正确性。 集成测试背后的原因 虽然软件应用程序的所有模块已经在单元测试中进行了测

  • 设计 集成测试包括 3 个模块:测试用例、测试环境以及测试引擎。 测试用例 用于定义待测试的 SQL 以及测试结果的断言数据。 每个用例定义一条 SQL,SQL 可定义多种数据库执行类型。 测试环境 用于搭建运行测试用例的数据库和 ShardingSphere-Proxy 环境。 环境又具体分为环境准备方式,数据库类型和场景。 环境准备方式分为 Native 和 Docker,未来还将增加 Emb

  • 我有一个控制器,其endpoint可以生成压缩数据的字节流。下面代码中的MyDtO和ZipService类是自定义类,它们的功能类似于POJO,我想将其内容添加到zip中,服务将获取POJO的字节并将其写入ZipoutStream,然后通过封装在带有相应HttpStatus和标头。“快乐路径”工作正常,正在按预期生成zip文件。 当我想测试抛出自定义的情况时,问题出在我的联调类中(如果压缩数据存在

  • 应用程序类文件: 集成测试:

  • 最后是MockRestTemplateConfiguration