解决ut 测试案例jackson 序列化mockito mock对象时出现无限递归问题
前提背景
1. 当前httpUtil中里面有个public的静态类httpResponse,每次http调用后创建这个静态类对象返回,无法new 出,只能通过其他方法调用后进行build方法调用在httpUtil类中创建对象返回
2.在测试案例中,mock了url方法调用返回httpResponse,
HttpUtils.HttpResponse resp = Mockito.mock(HttpUtils.HttpResponse.class);
Mockito.when(resp.getBody()).thenReturn("ok");
Mockito.when(resp.getStatusCode()).thenReturn(200);
3.跑测试案例的时候发现报错mockito Infinite recursion (StackOverflowError),详细查看发现是mock httpResponse后使用,使用了jackson进行httpResponse的json序列化打印日志。
debug后发现,mockito mock对象时,会对mock对象加上了一些隐藏的属性,而这个属性中,是带有循环依赖的,导致jackson序列化时造成栈溢出。
解决方法:
方法一:本地跑案例时,通过在对象中添加,可以针对有get方法的才进行序列化,避免对mockitoINterceptor对象进行序列化调用。
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE)
但项目提交后,运行整体test的话还是没有效果。
方法二:直接添加JacksonAnnotationIntrospector,对属性名称带有mockito的不做序列化,两边都可行
附:mockito的一些常用方法
https://blog.csdn.net/u014471561/article/details/89417754
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!