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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:06:03