JUnit测试外部Jar方法时,如何为其修改的入参引用变量设置预期值
解决方案
实现原理
Mockito的thenReturn方法仅支持设置方法的返回值,若需要模拟第三方方法修改传入可变引用类型参数的逻辑,需要使用thenAnswer回调,在回调中获取调用时传入的参数对象,直接修改其指向的堆内存内容即可实现预期效果。
注:你最初举的String类型入参示例不符合Java语法规则,String为不可变类型,第三方方法无法修改String入参的实际值,你当前使用的int数组属于可变引用类型,适配以下方案。
适配ImageSDK场景的代码实现
你只需在Mock UFM_Identify方法时使用如下写法即可同时模拟状态码返回、以及修改入参数组的赋值逻辑:
when(libSDK.UFM_Identify( any(), any(), anyInt(), any(), anyInt(), anyInt(), anyInt(), any(int[].class) )).thenAnswer(invocation -> { // 获取调用时传入的最后一个参数:pnMatchTemplate2Index数组 int[] matchIndexArr = invocation.getArgument(7); // 自定义赋值模拟匹配到的模板索引,示例为模拟匹配到第2个模板 matchIndexArr[0] = 2; // 自定义返回模拟的接口状态码,示例为0代表调用成功 return 0; });
测试说明
- 上述代码运行后,业务逻辑调用
UFM_Identify方法时,既可以拿到你设置的int类型状态码,传入的pnMatchTemplate2Index数组第0位也会被自动设置为你指定的索引值 - 后续调用
templates.get(pnMatchTemplate2Index[0])即可拿到对应索引的模板数据,你可以基于这个模拟值验证后续业务逻辑的正确性 - 如果需要覆盖不同测试分支(比如匹配失败、匹配到不同索引、接口调用异常等场景),只需修改
thenAnswer回调内的数组赋值和返回的状态码即可 - 若你的测试需要校验传入
UFM_Identify的参数是否符合预期,可将对应位置的any()匹配器替换为eq(期望参数值)
内容的提问来源于stack exchange,提问作者Hristo.L
相关产品推荐
相关产品推荐

