次のような内部クラスを持つクラスがあります:
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
は、ログでは確認されていますが、「呼び出された」ものとして検出されることはありません。何が問題なのですか?:)
ありがとう!
なにが問題ですか?
さて、ここでの問題は非常に微妙です。を呼び出すとMockito.spy(p)
、mockito
インスタンスのClassWithInnerObject
すべてのメソッド呼び出しを監視できるようにするために、インスタンスの背後にある種のデコレータが作成されます。そのおかげで、特定のメソッドが呼び出された回数を確認できますが、デコレータではインスタンスでは確認できません。そして、ここでは、内部クラスを使用すると、デコレータinnerFunc()
ではClassWithInnerObject
ないインスタンスMockito
innerFunc()
が呼び出されるため、for は呼び出されていません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加