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

如何在Mockito与JDK11中对被Spy的父类方法正确使用Argument Captor

问题分析与解决方案

你的测试代码无法捕获传给super.execute()的newInput,核心问题及修复方案如下:

1. 类型不匹配错误

你声明的ArgumentCaptor泛型为String,但execute方法的参数是Input类型,这会直接导致捕获逻辑失效,甚至引发类型转换异常。

2. 间谍对象的存根逻辑问题

虽然你尝试存根父类A的execute方法,但类型不匹配会让Mockito无法正确拦截并捕获目标参数。

正确的测试代码

// 假设Input类有合法构造方法与equals实现
Input expectedInput = new Input("hello anirudh");
Input input = new Input("hello");

// 创建B的间谍对象
B spyB = spy(new B());

// 声明对应参数类型的ArgumentCaptor
ArgumentCaptor<Input> captor = ArgumentCaptor.forClass(Input.class);

// 存根父类A的execute方法,确保调用super.execute时触发参数捕获
doReturn(null).when((A) spyB).execute(captor.capture());

// 执行测试方法
spyB.execute(input);

// 获取捕获的参数并断言
Input capturedArg = captor.getValue();
assertEquals(expectedInput, capturedArg);

额外注意事项

  • 确认B类中的updateInput方法确实正确修改了输入参数,返回预期的Input对象;
  • 检查Input类是否正确实现了equals方法,否则断言会因对象比较逻辑失效而失败;
  • 子类B的execute方法需补充返回语句(匹配父类方法的返回值要求),避免编译错误:
    class B extends A {
        @Override
        public String execute(Input input) {
            Input newInput = updateInput(input); // 补充变量类型声明
            return super.execute(newInput); // 补充返回父类方法结果的语句
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:45:18