2016-09-21 10 views
2

方法をスパイない内部クラスのメソッドを呼び出すときに、私は次のように内部クラスを持つクラスを持っている: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(); 
    } 

} 

最初のテストが機能しています。 2番目のinnerFuncはログには表示されていますが、「呼び出された」とは決して検出されません。何が間違っていますか? :)

ありがとう!

+1

私はすでに尋ねたこの質問が異なる場合であると思う: http://stackoverflow.com/a/22644040/5627827 –

答えて

4

どうしたのですか?あなたはMockito.spy(p)は、mockitoは、すべてのメソッドは、インスタンス上で呼び出しを監視することができClassWithInnerObjectのインスタンス上のシーンの後ろにデコレータのいくつかの種類を作成し、呼び出すとき

さて、ここでの問題は、非常に微妙です。そのおかげで、与えられたメソッドがと呼ばれているが、デコレータにはというインスタンスが何回あるかを調べることができます。ここで、内部クラスを使用すると、ClassWithInnerObjectのインスタンスでがデコレータにないので、MockitoinnerFunc()と呼ばれていません。

+1

どのように私はそれを –

+0

ニース、私はあなたの投稿つまずいたので、長い時間を修正することができます... – GhostCat

関連する問題