【问题标题】:Mockito spy - when calling inner class method not spying method in spy objectMockito spy - 当调用内部类方法而不是间谍对象中的间谍方法时
【发布时间】:2016-09-21 12:46:51
【问题描述】:

我有如下内部类的类:

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

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'

测试:

@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 从未被检测为“已调用”,尽管在日志中我看到它是。出了什么问题? :)

谢谢!

【问题讨论】:

标签: java android mockito


【解决方案1】:

怎么了?

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

【讨论】:

    【解决方案2】:

    您可以使用“ClassWithInnerObject.this”来解决这个问题。在内部类中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多