我有一个内层的课程如下:
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从未被检测为“调用”,尽管我在日志中看到它的is.What是错误的?)
谢谢!
发布于 2016-09-21 13:14:39
怎么啦?
嗯,这里的问题很微妙,当您调用Mockito.spy(p)时,mockito会在场景后面创建某种修饰器对ClassWithInnerObject实例进行某种修饰,允许监视您实例上的所有方法调用。由于这一点,您可以检查给定方法被调用了多少次,但在装饰器上只检查了,而不是在实例上。在这里,当您使用内部类时,它会在您的ClassWithInnerObject实例上调用ClassWithInnerObject,而不是在装饰器上调用,因此对于Mockito innerFunc() ,没有调用。
发布于 2021-03-04 13:08:23
您可以通过使用“ClassWithInnerObject.this”来解决这个问题。在内部课堂上。
public class InnerObject {
public void outerFunc() {
ClassWithInnerObject.this.innerFunc();
}
}https://stackoverflow.com/questions/39616976
复制相似问题