2015-06-18 1 views
1

Я использую mockito для проверки вызова интерфейса, но у меня возникают некоторые проблемы, когда я хочу проверить, что метод интерфейса goToLoginInterface() был вызван последовательно, когда я вызываю «goToLogin()». Это должно быть что-то простое, но я пытался найти решение часами. Я положил и утвержу, чтобы убедиться, что 'getActivityParent()' эффективно возвращает объект mock Interface, и это !, поэтому я не знаю, в чем проблема.Как проверить вызов интерфейса с Mockito?

public class LoginSimpleFragment extends Fragment { 

    private ActivityInterface mParentActivity; 

    public interface ActivityInterface { 
     void goToLoginInterface(); 
    } 

    public ActivityInterface getActivityInterface(){ 
     return mParentActivity; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.login_simple, container, false); 
    } 

    public void goToLogin() { 
     getActivityInterface().goToLoginInterface(); 
    } 
} 

Это мой тестовый класс

@Config(manifest = "../app/src/main/AndroidManifest.xml", emulateSdk = 18) 
@RunWith(RobolectricTestRunner.class) // <== REQUIRED for Robolectric! 
public class TestLoginActivity { 

    @Test 
    public void testPositiveButtonAction() throws Exception { 
     LoginSimpleFragment mockLoginSampleFragment = 
       mock(LoginSimpleFragment.class); 
     LoginSimpleFragment.ActivityInterface mockInterface = 
       mock(LoginSimpleFragment.ActivityInterface.class); 
     Mockito.doNothing().when(mockInterface).goToLoginInterface(); 

     //doReturn(mockInterface).when(mockLoginSampleFragment).getActivityInterface(); 
     when(mockLoginSampleFragment.getActivityInterface()).thenReturn(mockInterface); 
     mockLoginSampleFragment.goToLogin(); 

     assert(Mockito.mockingDetails(mockLoginSampleFragment.getActivityInterface()).isMock()); 
     verify(mockInterface).goToLoginInterface(); 
    } 

} 

тест на выходе сказал:

Wanted but not invoked: 
activityInterface.goToLoginInterface(); 
-> at co.mobico.mainactivities.TestLoginActivity.testPositiveButtonAction(TestLoginActivity.java:35) 
Actually, there were zero interactions with this mock. 

TestLoginActivity.java:35 является линия «проверить (mockInterface) .goToLoginInterface () ', в конце тестовой функции

Можете ли вы помочь пройти тест? Я использую TDD в Android с robolectric, поэтому, если я не могу решить проблему, я не могу продолжать работать, спасибо!

ответ

1

Вы потеряны в лабиринте издевательств.

На самом деле вы не используете LoginSampleFragment, вы используете Mock этого класса. Поэтому, когда вы вызываете goToLogin(), ничего не происходит, потому что макет не запускает ваш нормальный код класса.

Даже если вы поручаете вашему макету что-то делать, когда вы вызываете goToLogin(), на данный момент вы больше не тестируете свой код, вы просто проверяете свою собственную макетную настройку, вращающуюся по кругу.

Это может быть хорошее чтение: When should I mock?

+0

Вы правы, я должен тщательно проверить, прежде чем спрашивать, спасибо очень много друзей, вы помогли мне много –