如何在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
相关产品推荐
相关产品推荐

