Mockito是否有办法从内部类中运行被监视对象的存根方法?



我正在使用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不使用Outterthis实例,您可以使用反射来替换Inner'sOutter的引用。但是,由于Inner是一个实例内部类(而不是静态),并且由于getOutterName的调用使用隐式Outter.this,因此您没有机制来覆盖此

最新更新