如何解决使用间谍模拟在测试中的类中创建的完整对象
我具有以下结构:
import { getVolume,setVolume } from 'loudness';
const vol = await getVolume();
setVolume(100).then(() => {
// Say your warning here...
// Set volume back to the previous level
setVolume(vol);
});
现在,我想在类class A {
public A(String p){
// ...
}
public String AMethod(String p){
// ...
}
}
class B {
int method(String param){
A a = new A(param); int n;
String s = A.AMethod(param);
// ... (initializes n,...)
return n;
}
}
中测试method
,但是在调用B
时控制其输出。但是由于我没有在B的测试类中创建对象A,所以无法正常模拟它-我该如何模拟对象A?
我尝试了Mockito.spy,但似乎不起作用:
AMethod
(*)仍然不会被调用...但是间谍应该是正确的解决方案,不是吗?我的问题是:我从来没有在测试类中创建对象this.ASpy = spy(new A());
when(ASpy.createSession(any())).then(invocation -> {
// ... (*)
});
,仅在A
中创建了这样的对象,而没有在测试类中创建对象。
解决方法
处理此问题的最佳方法(如果可能)是修改类B的代码,以便将对象A注入到方法中(作为参数传递,设置为类字段或使用工厂类实例化) -将工厂作为字段注入,并且可以在测试中模拟工厂对象以返回模拟对象A)。
如果无法进行实际的代码修改,则可以使用PowerMock's whenNew method并在测试中返回模拟对象。
旁注:如果您使用的是JUnit 5,PowerMock可能不是一个可行的解决方案-阅读更多here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。