间谍的Mockito - 调用内部类方法时不刺探方法谍对象
我有一个内部类类如下:间谍的Mockito - 调用内部类方法时不刺探方法谍对象
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
允许监控所有方法在您实例调用实例的幕后创建某种装饰的。由于这一点,你可以检查一个给定的方法被称为多少次,但装饰者只有不在你的实例。在这里,当您使用内部类时,它会调用innerFunc()
您的实例ClassWithInnerObject
不在装饰器上,因此对于Mockito
innerFunc()
尚未被称为。
我该如何解决这个问题 –
很好,很久以来,我偶然发现了你的帖子... – GhostCat
我觉得这个问题已经是另一种情况了: http://*.com/a/22644040/5627827 –