You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:39:00