我有一个带有内部类的类,如下所示:
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();
}
}
}
模拟测试如下所示: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();
}
}