JMockit MockUp可以模拟toString()方法吗?

10
考虑以下示例 MockUp 类型的类 Foo,它在构造函数中拦截 Bar,然后使用 Bar 实现 toString() 方法;
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 类(实际上我可以,但是只是为了论证),有没有办法仅为这个 Foo 类模拟 toString()
明确一下,我想模拟该类的所有实例,而不仅仅是一个实例(对于这个问题,有容易的解决方法,不需要使用 MockUp)。

2
可能是重复问题:Jmockit:无法模拟 net.android.Uri 类的 toString 方法 - Jotunacorn
1个回答

0

JMockit 将模拟类层次结构中的所有超类一直到但不包括java.lang.Object

您可以在测试中定义私有最终类,该类通过重写toString()并通过调用super.toString()来委托BartoString()来扩展Bar

private final class Baz extends Bar {
    @Override
    public String toString() {
        return super.toString();
    }
}

现在你只需要在你的模拟中通过 Baz 委托,而不是 Bar

这样,你就可以得到一个具体而透明的 toString() 实现,可以在不触及潜在无法控制的 Bar 类的情况下进行模拟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接