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()
委托给 Bar
的 toString()
:
private final class Baz extends Bar
@Override
public String toString()
return super.toString();
现在您在模拟中所要做的就是通过Baz
而不是Bar
进行委托。
通过这种方式,您可以获得具体而透明的 toString()
实现,您可以在不触及可能无法控制的 Bar
类的情况下对其进行模拟。
【讨论】:
以上是关于JMockit MockUp 可以模拟 toString() 吗?的主要内容,如果未能解决你的问题,请参考以下文章
JMockit - 期望 - 匹配包含模拟对象作为参数的方法调用