簡體   English   中英

Mockito 間諜 - 當調用內部類方法而不是間諜對象中的間諜方法時

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

我有內部類的類如下:

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從未被檢測為“調用”,盡管在日志中我看到它是。有什么問題? :)

謝謝!

怎么了?

嗯,這里的問題很微妙,當你調用Mockito.spy(p)mockito在你的ClassWithInnerObject實例上創建了某種裝飾器,允許監視實例上的所有方法調用。 多虧了這一點,您可以檢查給定方法被調用了多少次,但只能在裝飾器上而不是在您的實例上。 在這里,當您使用內部類時,它會在您的ClassWithInnerObject實例上調用innerFunc()而不是在裝飾器上調用,因此對於Mockito innerFunc()沒有被調用

您可以使用“ClassWithInnerObject.this”來修復該問題。 在內部類。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM