我正在使用 Mockito 为其他人实现的代码编写 junit 测试。 简化:
- 有一个外部类和一个内部类
- 外部类保留内部类的实例。
- 内部类使用外部类的方法。
简化的代码可能如下所示:
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() 方法进行 stub ,以返回一个方便测试的值。 为此,我要“监视”该对象:
Outer outer=new Outer();
Outer spyOuter=spy(outer);
doReturn("outerspied").when(spyOuter).getOuterName();
现在,如果我打电话:
spyOuter.getObjectName();
spyOuter.getOuterNiceName();
在两次调用中都会调用 stub 方法,并且我得到字符串:“outerspied” 和“name=outerspied”
但是如果我打电话:
spyOuter.getInner().getInnerName();
在这种情况下,不会调用 stub 方法,而是调用原始方法。我期望“outerspied-inner”,但得到“outer-inner”
总而言之,在监视的外部对象中,引用“this”指向监视的实例。 但对于内部对象,对“Outer.this”的引用指向“非 spy ”实例。
我不知道我是否做错了什么,这是一个错误,还是它按设计工作;问题是:有解决方法吗?
提前非常感谢
最佳答案
I spy
仅使用代理包围被监视的对象。它没有任何机制来替换监视对象内的调用。因此,即使一个方法是通过 spy stub 的,如果 spy 对象直接调用该方法,则将调用 spy 对象的方法,而不是 spy 的 stub 。这基本上正是您的 Inner
/Outter
所发生的情况。如果 Inner
未使用 Outter
的 this
实例,您也许可以使用反射来替换 Inner's
的引用外部
。但由于 Inner
是一个实例内部类(而不是静态),并且由于 getOutterName
的调用使用隐式 Outter.this
,因此您不需要有一个机制可以覆盖它。
关于java - Mockito 有没有办法从内部类运行监视对象的 stub 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22638583/