JMockit MockUp可以模拟toString()吗?

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).

dig*_*ise 0

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可能超出您控制范围的类。