JMockit MockUp 可以模拟 toString() 吗?

Posted

技术标签:

【中文标题】JMockit MockUp 可以模拟 toString() 吗?【英文标题】:Can JMockit MockUp mock 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 的简单解决方案)。

【问题讨论】:

Jmockit: Can't mock method toString of net.android.Uri class的可能重复 【参考方案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 类的情况下对其进行模拟。

【讨论】:

以上是关于JMockit MockUp 可以模拟 toString() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

JMockit 基础:模拟对象、模拟参数、期望

JMockit - 期望 - 匹配包含模拟对象作为参数的方法调用

如何使用Jmockit模拟JdbcTemplate.update?

用jmockit模拟扩展类的抽象方法

如何从 Jmockit 中的模拟方法返回不同的值?

JMockit 模拟返回 String 而不是提供的 List<String>