模拟间谍-当调用内部类方法时,而不是间谍对象中的间谍方法



我有一个带有内部类的类,如下所示:

public class ClassWithInnerObject {
  private final InnerObject innerObject;
  public ClassWithInnerObject() {
    innerObject = new InnerObject();
  }
  public void callInnerObjectMethod() {
    innerObject.outerFunc();
  }
  public void outerFunc() {
    innerFunc();
  }
  public void innerFunc() {
    Log.d("XXX", "innerFunc: called");
  }
  public class InnerObject {
    public void outerFunc() {
      innerFunc();
    }
  }
}

模拟测试如下所示:build.gradle:

  androidTestCompile 'junit:junit:4.12'
  androidTestCompile 'org.mockito:mockito-core:1.10.19'
  androidTestCompile 'com.crittercism.dexmaker:dexmaker:1.4'
  androidTestCompile 'com.crittercism.dexmaker:dexmaker-mockito:1.4'
  androidTestCompile 'com.crittercism.dexmaker:dexmaker-dx:1.4'
测试:

@RunWith(AndroidJUnit4.class) public class SpyVerifyTest {
  @Test public void myInnerTestWorking() {
    ClassWithInnerObject p = new ClassWithInnerObject();
    ClassWithInnerObject spy = Mockito.spy(p);
    spy.outerFunc();
    verify(spy, times(1)).innerFunc();
  }

  @Test public void myInnerTestNotWorking() {
    ClassWithInnerObject p = new ClassWithInnerObject();
    ClassWithInnerObject spy = Mockito.spy(p);
    spy.callInnerObjectMethod();
    verify(spy, times(1)).innerFunc();
  }
}

第一个测试按预期工作。第二个innerFunc从未被检测为"调用",尽管在日志中我看到它是。怎么了?:)

谢谢!

怎么了?

嗯,这里的问题相当微妙,当您调用Mockito.spy(p)时,mockito在您的ClassWithInnerObject实例上创建了某种装饰器,允许监视您的实例上的所有方法调用。多亏了这一点,您可以检查给定方法被调用的次数,但只在装饰器上调用,而不是在您的实例上。在这里,当您使用内部类时,它会在ClassWithInnerObject的实例上调用innerFunc(),而不是在装饰器上,因此对于Mockito, innerFunc() 没有调用

你可以使用"ClassWithInnerObject.this."

public class InnerObject {
  public void outerFunc() {
    ClassWithInnerObject.this.innerFunc();
  }
}

最新更新