考虑下面的类MockUp示例Foo,它在构造函数中拦截Bar,然后根据Bar实现toString();
public class FooStub extends MockUp<Foo> {
private Bar bar;
@Mock
public void $init(Bar bar) {
this.bar = bar;
}
@Mock
public String toString() {
return bar.toString();
}
}如果Foo碰巧覆盖了toString(),那么所有操作都很好。否则,您将得到一个IllegalArgumentException:“在下面的模拟中找不到匹配的真正方法”。我从这里了解到,JMockit不查看基类,因此无法找到要模拟的toString()方法。
假设我不能修改Foo类(在现实中我可以修改,但只是为了论证),是否有任何方法可以仅仅为了这个toString()类来模拟Foo?
为了明确起见,我想模拟这个类的所有实例,而不仅仅是一个实例(它具有不需要MockUp的简单解决方案)。
发布于 2017-09-18 16:53:13
JMockit将模拟类层次结构上的所有超类,直到、,但不包括 java.lang.Object。
您可以在您的测试中定义private final类,它通过重写toString()来扩展Bar,通过调用super.toString()将其委托给Bar的toString()。
private final class Baz extends Bar {
@Override
public String toString() {
return super.toString();
}
}现在,在模拟中所要做的就是通过Baz而不是Bar进行委托。
通过这种方式,您可以获得toString()的具体而透明的实现,您可以在不接触可能超出您控制范围的Bar类的情况下对其进行模拟。
https://stackoverflow.com/questions/32798116
复制相似问题