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

测试含ObjectMapper的方法时遇No Serializer Found异常求助

问题分析与解决方案

核心错误点

你测试中的ObjectMapper打桩完全无效——Handler类内部会重新创建一个全新的ObjectMapper实例,根本不会使用你在测试中定义的mock或spy对象。同时,你mock的Object对象包含Mockito内部代理属性(如mockitoInterceptor),Handler里默认配置的ObjectMapper无法序列化这些内部类,最终抛出异常。

可行解决方案

方案1:用PowerMock拦截ObjectMapper构造调用(推荐)

通过PowerMock拦截Handler中new ObjectMapper()的操作,返回我们预先配置好的mock对象,这样就能完全控制序列化逻辑:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Handler.class) // 告知PowerMock需要处理Handler类的构造逻辑
public class HandlerTest {

    @Mock
    Object object;

    @Mock
    ResponseType response;

    @Mock
    ObjectMapper mockMapper;

    @Test
    public void handleRequest() throws Exception {
        // 拦截Handler内的ObjectMapper构造,返回我们的mock实例
        whenNew(ObjectMapper.class).withNoArguments().thenReturn(mockMapper);
        
        // 打桩convertValue方法的行为
        when(mockMapper.convertValue(object, ResponseType.class)).thenReturn(response);
        
        // 执行测试并验证
        ResponseType result = new Handler().handleRequest(object);
        assert result == response;
        verify(mockMapper).convertValue(object, ResponseType.class);
    }
}

方案2:改用真实Object对象(业务场景允许时)

如果不需要严格mockObject,可以用真实的可序列化对象替代mock实例,绕过序列化问题:

@Mock
ResponseType response;

@Test
public void handleRequest() throws Exception {
    // 使用真实的空对象,而非Mockito mock的Object
    Object realObject = new Object();
    
    // 同样需要拦截ObjectMapper构造,返回mock实例
    ObjectMapper mockMapper = mock(ObjectMapper.class);
    whenNew(ObjectMapper.class).withNoArguments().thenReturn(mockMapper);
    when(mockMapper.convertValue(realObject, ResponseType.class)).thenReturn(response);
    
    ResponseType result = new Handler().handleRequest(realObject);
    assert result == response;
}

补充说明

你之前尝试用spy包装ObjectMapper无效,本质原因是Handler内部的mapper是局部创建的全新实例,你的spy对象从未被Handler使用过,自然无法生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:20:17