2016-09-21 1 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(); 
    } 

} 

Первый тест работает, как ожидалось. Второй innerFunc никогда не обнаруживается как «вызывается», хотя в журнале я вижу, что это так. Что не так? :)

Спасибо!

+1

Я думаю, что этот вопрос уже задавал другой случай: http://stackoverflow.com/a/22644040/5627827 –

ответ

4

Что не так?

Ну, проблема здесь довольно искусный, когда вы звоните Mockito.spy(p), mockito создает за сценой какой-то декоратор над экземпляром ClassWithInnerObject, позволяющей контролировать все методы вызовов на вашем экземпляре. Благодаря этому вы можете проверить, сколько раз данный метод был вызван , но только на декораторе не на вашем экземпляре. И здесь, когда вы используете внутренний класс, он называет innerFunc() на вашем примере ClassWithInnerObject не на декораторе, поэтому для MockitoinnerFunc()не был вызван.

+1

Как я могу это исправить –

+0

Nice, долгое время, так как я споткнулся вывешиванием вашего ... – GhostCat

Смежные вопросы