Ошибка Mockito: однако с этим макетом произошло ровно 1 взаимодействие.

Здравствуйте, я пытаюсь использовать mockito, чтобы проверить пароль пользователя, если он недействителен, я хочу убедиться, что он показывает сообщение об ошибке.

Но я получил следующую ошибку:

Wanted but not invoked:
loginView.showPasswordError();
-> at android.fanjavaid.com.tdd_android_login.LoginActivityTest.invalidPassword_notLoggedIn_showPasswordError(LoginActivityTest.java:84)

However, there was exactly 1 interaction with this mock:
loginView.showEmailError();
-> at android.fanjavaid.com.tdd_android_login.presenter.LoginPresenterImpl.validateInput(LoginPresenterImpl.java:23)

Вот мой метод тестирования:

@Test
public void invalidEmail_notLoggedIn_showEmailError() {
    LoginPresenter presenter = new LoginPresenterImpl(loginView, validator);
    presenter.validateInput(user);

    verify(loginView).showEmailError();
}

@Test
public void invalidPassword_notLoggedIn_showPasswordError() {
    when(user.getEmailAddress()).thenReturn("[email protected]");

    LoginPresenter presenter = new LoginPresenterImpl(loginView, validator);
    presenter.validateInput(user);

    verify(loginView).showPasswordError();
}

Я уже издеваюсь над пользователем электронной почты в invalidPassword_notLoggedIn_showPasswordError() с правильным вводом, но все равно получаю это сообщение об ошибке.

Вот моя реализация Presenter:

@Override
public void validateInput(User user) {
    if (!validator.validateEmail(user.getEmailAddress())) {
        view.showEmailError();
    } else if (validator.validatePassword(user.getPassword())) {
        view.showPasswordError();
    }
}

Что мне не хватает?

Спасибо


person fanjavaid    schedule 14.11.2017    source источник
comment
Можете ли вы отладить и проверить ссылку на объект loginView в методе тестирования и в реальном методе? если они разные, то mockito подходит для неудачной проверки.   -  person Raf    schedule 14.11.2017
comment
Рад, что у вас есть ответ на вашу проблему! Чтобы респондентам было легче узнать, что вы отсортировали, и чтобы будущие читатели могли найти ваше решение, пожалуйста, отредактируйте свое решение так, чтобы не возникало вопросов и в самостоятельный ответ, который вы можете принять позже.   -  person Jeff Bowman    schedule 15.11.2017


Ответы (1)


✔ ОТВЕТ

Через несколько минут исследования я обнаружил кое-что интересное. Я забыл добавить макет к одному классу. Ниже я издеваюсь над некоторыми классами, но не так:

@RunWith(MockitoJUnitRunner.class)
public class LoginActivityTest {

    @Mock User user;
    @Mock LoginView loginView;
    @Mock MyValidator validator;

    LoginPresenter presenter;

    @Before
    public void beforeTest() {
        presenter = new LoginPresenterImpl(loginView, validator);
    }

...

Вы можете видеть, что я издеваюсь над классом валидатора.

Я получил сообщение об ошибке, потому что в методе invalidPassword_notLoggedIn_showPasswordError() я не добавлял фиктивное значение для проверки электронной почты.

// Mock validation
when(validator.validateEmail(user.getEmailAddress())).thenReturn(true);

Если я не буду издеваться над ним, он спросит о showEmailError(), но мы просто проверяем showPasswordError()

Это приводит к тому, что моя реализация использует условие для проверки по одному, начиная с проверки электронной почты, действительна или нет, а затем пароль действителен или нет. Если адрес электронной почты не существует и значение, возвращаемое валидатором, не существует, произойдет ошибка.

Поэтому мне нужно имитировать адрес электронной почты как действительный и имитировать валидатор, чтобы вернуть истину (действительный адрес электронной почты).

Это мое объяснение, и я надеюсь, что это поможет любому, кто попробует mockito.

person fanjavaid    schedule 21.11.2017