JUnit测试:如何验证objectMapper.readValue传非法字符串时抛出异常
实现方案
核心思路
- 分两种测试维度:单元测试仅验证Controller方法内
objectMapper.readValue的异常抛出逻辑,集成测试验证完整接口的请求响应行为 - 使用JUnit 5内置的
assertThrows方法直接捕获目标异常,验证异常类型是否为JsonProcessingException - 测试用例传入不符合
Example类结构的非法字符串(比如随机非JSON串、字段类型不匹配的错误JSON)触发异常
代码示例
单元测试(无需启动Spring上下文,执行速度快)
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; public class ExampleControllerTest { // 使用真实的ObjectMapper实例验证序列化逻辑 private final ObjectMapper objectMapper = new ObjectMapper(); // Mock掉Service层依赖,仅聚焦Controller层逻辑测试 private final ExampleService exampleService = mock(ExampleService.class); // 手动构造Controller实例,避免依赖注入问题 private final ExampleController exampleController = new ExampleController(objectMapper, exampleService); @Test void findByExample_throwJsonProcessingExceptionIfInputInvalid() { // 构造非法入参:完全不符合JSON格式的字符串 String invalidExampleParam = "not-a-valid-json-string"; // 断言调用方法时会抛出JsonProcessingException assertThrows(JsonProcessingException.class, () -> exampleController.findByExample(invalidExampleParam)); } }
集成测试(启动Spring上下文,验证完整接口行为)
如果你需要验证接口请求的完整链路,包括异常到HTTP响应的映射,可以使用MockMvc做集成测试:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @AutoConfigureMockMvc public class ExampleControllerIntegrationTest { @Autowired private MockMvc mockMvc; @Test void findByExample_returnErrorStatusIfInputInvalid() throws Exception { String invalidExampleParam = "invalid-json-string"; mockMvc.perform(get("/find-example") .param("example", invalidExampleParam)) // 无全局异常处理时Spring默认返回500,若有自定义异常处理修改为对应状态码即可 .andExpect(status().isInternalServerError()); } }
补充说明:如果你的项目配置了全局异常处理器捕获
JsonProcessingException并返回指定状态码(比如400 Bad Request),将集成测试中的状态码断言改为对应值即可。如果需要验证异常的具体信息,可以接收assertThrows返回的异常实例,进一步校验异常消息内容。
内容的提问来源于stack exchange,提问作者user12699436
相关产品推荐
相关产品推荐

