java - JMockit MockUp 可以模拟 toString() 吗?

标签 java unit-testing mocking jmockit

考虑以下示例 MockUpFoo 拦截构造函数中的 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)给 BartoString() 来扩展 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/

相关文章:

java - Jackson JsonUnwrapped 和通用

java - 四元素数组对象的setter方法?

java - 如何在使用 iText 创建的 PDF 中显示阿拉伯语

c# - NUnit 确实需要 "magic strings"而 MSTest 不需要吗?

python - 如何模拟导入实例的方法

java - 何时在 Java/Android 中创建另一个包

c# - 单元测试时 stub 与模拟

unit-testing - EasyMock中正确使用expectLastCall().once()

来自基类的 Python 模拟 psycopg2

unit-testing - 在 JUnit 的方法内模拟对象