简体   繁体   English

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

[英]Mockito spy - when calling inner class method not spying method in spy object

I have class with inner class as following:我有内部类的类如下:

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();
    }
  }
}

And the mockito test is looking as following: build.gradle:而 mockito 测试看起来如下: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'

Test:测试:

@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();
  }

}

The first test is working as expected.第一个测试按预期工作。 The second one the innerFunc is never detected as "invoked", although in the log I see it is.What is wrong?第二个innerFunc从未被检测为“调用”,尽管在日志中我看到它是。有什么问题? :) :)

Thanks!谢谢!

What is wrong?怎么了?

Well, the problem here is quite subtle, when you call Mockito.spy(p) , mockito creates behind the scene some kind of decorator over your instance of ClassWithInnerObject allowing to monitor all methods calls on your instance.嗯,这里的问题很微妙,当你调用Mockito.spy(p)mockito在你的ClassWithInnerObject实例上创建了某种装饰器,允许监视实例上的所有方法调用。 Thanks to that, you can check how many times a given method has been called but on the decorator only not on your instance.多亏了这一点,您可以检查给定方法被调用了多少次,但只能在装饰器上而不是在您的实例上。 And here, when you use an inner class, it calls innerFunc() on your instance of ClassWithInnerObject not on the decorator so for Mockito innerFunc() has not been called .在这里,当您使用内部类时,它会在您的ClassWithInnerObject实例上调用innerFunc()而不是在装饰器上调用,因此对于Mockito innerFunc()没有被调用

You can Fix that by using "ClassWithInnerObject.this."您可以使用“ClassWithInnerObject.this”来修复该问题。 in inner class.在内部类。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM