[英]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.