我正在使用Mockito为别人已经实现的代码编写单元测试。简化:
- 有一个外部类和一个内部类 外部类保留了内部类的一个实例。内部类使用外部类的方法。
简化后的代码看起来像这样:
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";
}
}
}
我想存根外层类的getOuterName()方法,以返回一个便于测试的值。要做到这一点,我正在"监视"对象:
Outer outer=new Outer();
Outer spyOuter=spy(outer);
doReturn("outerspied").when(spyOuter).getOuterName();
现在,如果我调用
spyOuter.getObjectName();
spyOuter.getOuterNiceName();
在两次调用中都调用了存根方法,并且我得到了字符串:" outerspy "one_answers"name = outerspied"
但是如果我调用:
spyOuter.getInner().getInnerName();
在这种情况下,不调用存根方法,而是调用原始方法。我原以为是" outerspy -inner",结果是"outer-inner"
总之,在被监视的外部对象中,引用"this"指向被监视的实例。但是对于内部对象,对"外部"的引用。这指向一个"非监视"实例。
我不知道是我做错了什么,这是一个bug,或者它是按照设计工作的;问题是:有没有变通的办法?
提前致谢
I spy
仅用代理包围监视对象。它没有任何机制来替换监视对象中的调用。因此,即使一个方法通过间谍存根,如果被监视对象直接调用该方法,被监视对象的方法被调用,而不是间谍的存根。这基本上就是你的Inner
/Outter
所发生的。如果Inner
不使用Outter
的this
实例,您可以使用反射来替换Inner's
对Outter
的引用。但是,由于Inner
是一个实例内部类(而不是静态),并且由于getOutterName
的调用使用隐式Outter.this
,因此您没有机制来覆盖此