首页 > 解决方案 > Spring Boot 单元测试端点 NullPointerException - 以及如何达到 100% 的覆盖率

问题描述

我是 Spring Boot 测试的新手,我正在尝试测试和端点。按照教程,我这样做了:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = SpringMiddlewareApplication.class)
@ComponentScan("com.springmiddleware")
@SpringBootTest
public class SpringMiddlewareApplicationTests {

private MockMvc mvc;

@Test
public void returnsString() {
    try {
        this.mvc.perform(get("/home")).andExpect(status().isOk())
        .andExpect(content().string(containsString("You are in the home page")));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

如果我运行测试它通过,但控制台中显示以下错误:

java.lang.NullPointerException
at com.example.demo.SpringMiddlewareApplicationTests.returnsString

RestController 类如下:

@RestController
public class FirstController {


    /**
     * Welcome page
     * 
     * @return String
     */
    @GetMapping("/home")
    public String homePage() {
        return "You are in the home page";
    }

是什么导致错误?
此外,即使此测试通过,运行 Jacoco 我也没有覆盖方法“homePage”。我如何实现这一目标?

标签: spring-boottestingjunitjacocojacoco-maven-plugin

解决方案


您的对象 mvc 为空!您的测试类必须如下所示:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = SpringMiddlewareApplication.class)
@ComponentScan("com.springmiddleware")
@SpringBootTest
public class SpringMiddlewareApplicationTests {

    private MockMvc mvc;

    @Autowired
    private FirstController firstController;

    @Before
    public void init() {
        mvc = MockMvcBuilders.standaloneSetup(firstController)
                .addPlaceholderValue("server.servlet.context-path", "example").build();

    }

    @Test
    public void returnsString() {
        try {
            this.mvc.perform(get("/home")).andExpect(status().isOk())
                    .andExpect(content().string(containsString("You are in the home page")));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

推荐阅读