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

如何用Mockito抛出JsonProcessingException?测试异常触发失败求助

问题分析与解决方案

你的问题核心在于测试中Mock的ObjectMapper没有真正替换掉Controller里使用的实例,导致Controller始终用自己的ObjectMapper执行序列化,自然不会触发异常。下面一步步帮你解决:

第一步:修复Controller的ObjectMapper注入问题

首先,你的Controller里同时用了@Autowired和new ObjectMapper(),这是矛盾的——Spring会注入一个实例,但你又手动new了一个覆盖它,应该去掉手动实例化的部分,让Spring管理ObjectMapper:

@Autowired 
private ObjectMapper mapper; // 移除=new ObjectMapper(),依赖Spring注入

第二步:正确Mock并注入ObjectMapper到测试上下文

测试时,你需要用@MockBean注解来替换Spring容器中的ObjectMapper实例,这样Controller会自动使用这个Mock对象,而不是原来的实例。正确的测试代码如下:

@WebMvcTest(你的Controller类名.class) // 替换成你实际的Controller类名称
public class YourControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean // 关键:用这个Mock对象替换Spring容器里的ObjectMapper
    private ObjectMapper mapperMock;

    @Test
    public void testKo() throws Exception {
        // 设定Mock行为:当调用writeValueAsString处理Prueba对象时抛出异常
        doThrow(new JsonProcessingException("测试序列化异常") {}).when(mapperMock).writeValueAsString(any(Prueba.class));

        // 构造请求并执行
        String jsonContent = "{\"nombre\": \"123456\", \"apellidos\": \"12\"}";
        this.mvc.perform(post("/postPrueba")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(jsonContent))
                .andExpect(status().isInternalServerError());
    }
}

为什么之前的测试失败?

  • 你用@Mock创建的mapperMock只是一个孤立的Mock对象,没有注入到Controller中,Controller依然使用自己的ObjectMapper
  • 你手动Spy的new ObjectMapper()也是一个新实例,同样没有替换Controller里的对象
  • @MockBean会自动将Mock对象注册到Spring测试上下文,替换掉原有的ObjectMapper实例,确保Controller使用的是我们设定好行为的Mock对象

额外提示

  • JsonProcessingException是抽象类,所以必须创建匿名子类来实例化,你之前的写法是对的
  • 如果想让真实的ObjectMapper抛出异常(而非Mock),可以给Prueba类添加一个无法序列化的字段(比如一个没有无参构造的内部类),但Mock的方式更可控,适合单元测试

内容的提问来源于stack exchange,提问作者Mr Craft2004

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:10:43