首页 > 解决方案 > 如何实际测试具有空指针异常的控制器的服务器响应

问题描述

我想编写一个测试来评估在处理请求时具有 NullPointerException 的控制器的响应。

为此,我编写了一个控制器,它在处理请求时抛出一个 NullPointer。使用 MockMVC 控制器,我向该控制器发送 GET 请求。

在处理空指针时抛出空指针的控制器:

@Controller
public class Controller{  

    @GetMapping(value = "/api/data")
    @ResponseBody
    public ResponseEntity<Resource> getData() {

        if (true)
            throw new NullPointerException(); // Intended Nullpointer Exception 

        return ResponseEntity.notFound().build();
    }
}

我预计会收到 500 错误的测试函数:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc

public class Test {

    @Autowired
    protected MockMvc mockMvc;

    @Test
    public void shouldReturn500StatusWhenControllerThrowsAnException() throws Exception {
        MvcResult result = this.mockMvc.perform(get("/api/data"))
            .andExpect(status().is5xxServerError())
            .andReturn();
    }

}

我希望 MockMVC 请求返回错误 500,就像真正的控制器作为服务器运行时一样。实际上,MockMVC 只是因 NullPointer 异常而失败,并且不返回任何内容。

标签: javaspringrest

解决方案


我使用 WebTestClient 找到了适合我的解决方案。

向我的 build.gradle 添加了两个新依赖项:

testCompile "org.springframework.boot:spring-boot-starter-webflux:2.1.3.RELEASE"
testCompile "org.springframework.boot:spring-boot-starter-test:2.1.3.RELEASE"

测试函数如下所示:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Test {

    @Autowired
    private WebTestClient webTestClient;

    @Test
    public void shouldReturn500StatusWhenControllerThrowsAnException() throws Exception {

        webTestClient.get().uri("/api/data")
            .exchange()
            .expectStatus().is5xxServerError();

    }

}

就像 GET 请求返回错误 500 一样,它在现实世界条件下的表现完全一样。


推荐阅读