考虑以下示例MockUp
的示例Foo
,它拦截构造函数中的Bar
,然后根据toString()
实现Bar
;
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
)。
答案 0 :(得分:0)
JMockit 将模拟类层次结构中的所有超类最多,但不包括 java.lang.Object
。
您可以在测试中定义private final
类,其中Bar
通过调用toString()
覆盖Bar
toString()
super.toString()
来调用private final class Baz extends Bar {
@Override
public String toString() {
return super.toString();
}
}
}:
Baz
现在,您在模拟中所要做的就是通过Bar
而不是toString()
进行委派。
通过这种方式,您可以实现Bar
的具体而透明的实现,您可以在不触及可能无法控制的terms
类的情况下进行模拟。