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'sOutter Inner's引用。 但是由于Inner是一个实例内部类(而不是静态),并且因为getOutterName调用使用了隐式Outter.this你没有机制来覆盖它。