2016-03-12 5 views
0

Я тестирую модуль класса Presenter, который подключается к сервису и возвращает токен Когда пользователь получает токен из задачи Async, которая вызывает службы REst, запускается начальный экран. Если маркер нулевой ошибки отображаетсяMocking class class

public void onSignInButtonClicked() { 

    String username = mSigninView.getUsername(); 


    if (username.isEmpty()) { 
     mSigninView.showUsernameError(R.string.username_error); 
     return; 
    } 

    String password = mSigninView.getPassword(); 
    if (password.isEmpty()) { 
     mSigninView.showPasswordError(R.string.password_error); 
     return; 
    } 

    String token = mSigninService.connectToRestServices(username, password); 
    if (token != null) { 
     mSigninView.startHomeActivity(token); 
    } else { 
     mSigninView.showLoginError(R.string.login_error); 
    } 
} 

Для модульного тестирования:

@Test 
public void shouldStartHomeScreenWhenUsernameAndPasswordAreCorrect() throws Exception { 
    Mockito.when(mView.getUsername()).thenReturn("[email protected]"); 
    Mockito.when(mView.getPassword()).thenReturn("test"); 
    Mockito.when(mService.connectToRestServices("[email protected]", "test")).thenReturn("test"); 
    mPresenter.onSignInButtonClicked(); 
    Mockito.verify(mView).startHomeActivity("test"); 
} 

Ошибка при тестировании

Wanted, но не вызывается: signin_View.startHomeActivity ("тест"); -> в com.ssd.cypress.uimobile.SigninPresenterTest.shouldStartHomeScreenWhenUsernameAndPasswordAreCorrect (SigninPresenterTest.java:72)

В код Строковый = mSigninService.connectToRestServices (имя пользователя, пароль); Он соединяется с конкретным классом, а токен равен нулю. Есть ли способ обмануть этот connectToService, чтобы он возвращал SomeValue.

+0

Если я не ошибаюсь, ваш токен не равен нулю, и он пытается выполнить startHomeActivity («test»). Поэтому он возвращает «SomeValue». Попробуйте выполнить модульный тест в режиме отладки и посмотреть, что именно представляет собой значение токена, которое вы получаете до того, как будет произведено нулевое сравнение. – Rg90

+0

спасибо за ваш отзыв !!! Маркер всегда равен нулю. В моем коде конструктор для презентатора – Rick

+0

public SigninPresenter (вид Signin_View) { mSigninView = view; mSigninService = новый Sign_in_service(); } – Rick

ответ

0

Ваш мастер-сервис-сотрудник mService никогда не вызывается во время теста, потому что он не передается или не вводится в тестируемый класс. Основываясь на ваших комментариях, я думаю, вы понимаете это.

Чтобы выразить ваши комментарии так, как я их понимаю, вы хотите использовать макет соавтора - экземпляр Sign_in_service - но вы не можете этого сделать, потому что соавтор создан, а не передается в ваш класс под тестом - SigninPresenter.

Проблема заключается в вашем конструкторе SigninPresenter, который не должен нести ответственность за создание соавтора. Кажется, что у вас есть код, о котором идет речь, поэтому вы можете изменить дизайн.

Я предлагаю вам заменить SigninPresenter конструктор следующим:

public static SigninPresenter createSigninPresenterWithService(Signin_View view) { 
     return new SigninPresenter(view, new Sign_in_service()); 
    } 

    protected SigninPresenter(Signin_View view, Sign_in_service service) { 
     mSigninView = view; 
     mSigninService = service; 
    } 

Для вашего теста вы можете вызвать конструктор и передать в издеваться службы для инициализации mPresenter, то есть: mPresenter = new SignInPresenter(mView, mService). В вашем производственном коде, который в настоящее время вызывает конструктор SigninPresenter, вы можете заменить вызов конструктора new SigninPresenter(view) вызовом статического заводского метода createSigninPresenterWithService(view).

+0

Большое спасибо за предложение. Работает для меня. – Rick

+0

Добро пожаловать. в этом случае, пожалуйста, выберите мой ответ в качестве решения проблемы, щелкнув галочку слева. –