java - 如何实际测试具有空指针异常的控制器的服务器响应
问题描述
我想编写一个测试来评估在处理请求时具有 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 异常而失败,并且不返回任何内容。
解决方案
我使用 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 一样,它在现实世界条件下的表现完全一样。
推荐阅读
- jasperserver - 在不传递用户名和密码或匿名用户的情况下访问 JasperReport
- javascript - 如何等待一个函数完成并使用 graphQL 调用第二个函数
- javascript - document.getElementsByClassName(...) 返回“...不是函数”
- linux - 如何在python中捕获sql文件执行的输出
- google-bigquery - 根据 RECORD(repeated) 类型的列中不存在键来过滤 ROWs 列
- java - 当我们使用无法引用数据框时如何取消持久化
- javascript - 如何检查 Node 中使用了哪个端口
- javascript - 如何到达数组中的嵌套元素(javascript)
- wireshark - WireShark 远程捕获失败:未实现 NFLOG 链路层类型过滤
- java - 当一个类被卸载时,JVM 是否做出任何保证?