测试含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
相关产品推荐
相关产品推荐

