考虑以下示例 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
的简单解决方案)。
最佳答案
JMockit 将模拟类层次结构中的所有父类(super class)up to,但不包括 java.lang.Object
.
您可以在测试中定义 private final
类,它通过覆盖委托(delegate)给 Bar
的 toString()
来扩展 Bar
code> 的 toString()
通过调用 super.toString()
:
private final class Baz extends Bar {
@Override
public String toString() {
return super.toString();
}
}
现在您在 mock 中所要做的就是通过 Baz
而不是 Bar
进行委托(delegate)。
通过这种方式,您可以获得 toString()
的具体而透明的实现,您可以在不触及可能不受您控制的 Bar
类的情况下对其进行模拟。
关于java - JMockit MockUp 可以模拟 toString() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32798116/