JMockit MockUp可以模拟toString()吗?

时间:2015-09-26 14:14:19

标签: java unit-testing mocking jmockit

考虑以下示例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)。

1 个答案:

答案 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类的情况下进行模拟。