间谍的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永远不会被检测为“被调用”,虽然在日志中我看到它是。什么是错的? :)

谢谢!

+1

我觉得这个问题已经是另一种情况了: http://*.com/a/22644040/5627827 –

出了什么问题?

好了,这里的问题是相当微妙的,当你调用Mockito.spy(p)mockito在你的ClassWithInnerObject允许监控所有方法在您实例调用实例的幕后创建某种装饰的。由于这一点,你可以检查一个给定的方法被称为多少次,但装饰者只有不在你的实例。在这里,当您使用内部类时,它会调用innerFunc()您的实例ClassWithInnerObject不在装饰器上,因此对于MockitoinnerFunc()尚未被称为

+1

我该如何解决这个问题 –

+0

很好,很久以来,我偶然发现了你的帖子... – GhostCat