单元测试异常处理器 是做什么的?
提供在Spring Boot应用程序中单元测试@ExceptionHandler和@ControllerAdvice的模式。验证错误响应的格式、模拟异常、验证HTTP状态码、测试字段级验证错误,并断言自定义错误负载。适用于编写Spring异常处理器测试、REST API错误测试或模拟控制器通知。
核心功能
- 模拟异常:轻松创建和配置受支持的控制器的异常场景。
- 验证HTTP状态码:断言在异常情况下返回正确的状态码(如400、404、500)。
- 验证错误响应格式:检查JSON/XML错误响应的结构,包括字段、类型和存在性。
- 测试字段级验证错误:模拟
MethodArgumentNotValidException并验证每个字段的错误消息。 - 断言自定义错误负载:验证自定义
@ExceptionHandler方法返回的错误代码、时间戳、跟踪ID或其他特定字段。 - 模拟控制器通知:在测试中直接模拟
@ControllerAdvice,无需启动完整Spring上下文。
支持平台
- Spring Boot 2.x 和 3.x
- Java 17+
- JUnit 5
- Mockito
如何使用
以下是一个简单的测试示例,展示如何使用此技能测试自定义@ExceptionHandler:
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@WebMvcTest(MyController.class)
class MyControllerExceptionHandlerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private MyService myService;
@Test
void whenResourceNotFound_thenReturns404() throws Exception {
when(myService.getResource(1L)).thenThrow(new ResourceNotFoundException("Resource not found"));
mockMvc.perform(get("/api/resources/1"))
.andExpect(status().isNotFound())
.andExpect(jsonPath("$.error").value("Not Found"))
.andExpect(jsonPath("$.message").value("Resource not found"));
}
}
测试字段级验证错误
@Test
void whenValidationFails_thenReturns400() throws Exception {
String invalidBody = "{\"name\":\"\"}";
mockMvc.perform(post("/api/resources")
.contentType(MediaType.APPLICATION_JSON)
.content(invalidBody))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.fieldErrors").isArray())
.andExpect(jsonPath("$.fieldErrors[0].field").value("name"))
.andExpect(jsonPath("$.fieldErrors[0].message").value("must not be blank"));
}
其他资源
本技能由社区贡献,专为提高Spring Boot异常处理器测试的效率和可靠性而设计。