Bog*_*mac 9 java unit-testing jmockit mocking
考虑下面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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果Foo恰好覆盖toString()所有工作正常.否则,你得到一个IllegalArgumentException:"找不到以下模拟的真实方法".我从这里理解JMockit不查看基类,因此无法找到一个toString()模拟方法.
假设我无法修改Foo类(实际上我可以,但仅仅是为了参数),有没有办法toString()只为这个Foo类进行模拟?
要清楚,我想模拟这个类的所有实例,而不仅仅是一个实例(具有不需要的简单解决方案MockUp).
JMockit将模拟类层次结构中直到 的所有超类,但不包括 java.lang.Object。
您可以private final在测试中定义类,Bar通过调用覆盖toString()哪些委托来扩展:BartoString()super.toString()
private final class Baz extends Bar {
@Override
public String toString() {
return super.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您在模拟中所要做的就是通过Baznot进行委托Bar。
通过这种方式,您可以获得具体而透明的实现,toString()您可以对其进行模拟,而无需触及Bar可能超出您控制范围的类。