Mockito有没有办法从内部类中运行一个间谍对象的存根方法?
我正在使用Mockito为其他人实现的代码编写junit测试。 简化:
- 有一个外类和一个内部类
- Outer类保留Inner类的实例。
- Inner类使用Outer类的方法。
简化的代码可能如下所示:
public class Outer { private Inner inner; public Outer(){ inner=new Inner(); } public Inner getInner(){ return inner; } public String getOuterName(){ return "outer"; } public String getOuterNiceName(){ return "name="+getOuterName(); } public class Inner { public String getInnerName(){ return getOuterName()+"-inner"; } } }
我想将Outer类的方法getOuterName()存根,以返回一个方便我测试的值。 要做到这一点,我正在“窥探”对象:
Outer outer=new Outer(); Outer spyOuter=spy(outer); doReturn("outerspied").when(spyOuter).getOuterName();
现在,如果我打电话:
spyOuter.getObjectName(); spyOuter.getOuterNiceName();
在两个调用中都调用了stubbed方法,我得到了字符串:“outerspied”和“name = outerspied”
但是,如果我打电话:
spyOuter.getInner().getInnerName();
在这种情况下,不会调用存根方法,而是调用原始方法。 我期待“outerspied-inner”,但得到“外在内在”
总而言之,在间谍外部对象中,引用“this”指向间谍实例。 但对于内部对象,对“Outer.this”的引用指向“非侦察”实例。
我不知道我做错了什么,这是一个错误,或者它是按照设计工作的; 问题是:有解决方法吗?
提前谢谢了
我spy
只用代理围绕spy
对象。 它没有任何机制来替换spied对象中的调用。 因此,即使方法是通过间谍存根,如果间谍对象直接调用该方法,则调用间谍对象的方法而不是间谍的存根。 这基本上就是你的Inner
/ Outter
。 如果Inner
没有使用this
Outter
实例,你可以使用reflection代替Inner's
对Outter
Inner's
引用。 但是由于Inner
是一个实例内部类(而不是静态),并且因为getOutterName
调用使用了隐式Outter.this
你没有机制来覆盖它。