【问题标题】:Can JMockit MockUp mock toString()?JMockit MockUp 可以模拟 toString() 吗?
【发布时间】:2015-12-24 05:26:39
【问题描述】:

考虑以下示例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 类(实际上我可以,但只是为了论证),有没有办法模拟 toString() 只是为了这个 Foo 类?

明确地说,我想模拟这个类的所有实例,而不仅仅是一个实例(它有不需要MockUp 的简单解决方案)。

【问题讨论】:

标签: java unit-testing mocking jmockit


【解决方案1】:

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

您可以在测试中定义 private final 类,该类通过覆盖 toString() 来扩展 Bar,该类通过调用 super.toString() 委托给 BartoString()

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

现在您在模拟中所要做的就是通过Baz 而不是Bar 进行委托。

通过这种方式,您可以获得具体而透明的 toString() 实现,您可以在不触及可能无法控制的 Bar 类的情况下对其进行模拟。

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 2021-01-07
    • 2020-02-21
    • 2014-09-14
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多