Тестирование Мосби с Мокито

Я использую Mosby, и я хотел бы проверить моего простого докладчика.

public class DetailsPresenter extends MvpBasePresenter<DetailsView> {

public void showCountry(Country country) {
    getView().setTitle(country.getName());
    getView().setFlag(country.getFlagUrl());
}

}

Я пытался решить это, издеваясь над докладчиком:

public class DetailsPresenterTest {

private DetailsPresenter mockPresenter;
private DetailsView mockView;

@Before
public void setUp() throws Exception {
    mockPresenter = mock(DetailsPresenter.class);
    mockView = mock(DetailsView.class);

    when(mockPresenter.isViewAttached()).thenReturn(true);
    when(mockPresenter.getView()).thenReturn(mockView);

    doCallRealMethod().when(mockPresenter).showCountry(any(Country.class));
}

@Test
public void shouldShowFlag() throws Exception {
    mockPresenter.showCountry(any(Country.class));
    verify(mockView, times(1)).setFlag(anyString());
}

@Test
public void shouldShowName() throws Exception {
    mockPresenter.showCountry(any(Country.class));
    verify(mockView, times(1)).setTitle(anyString());
}

}

Но у меня есть ошибка

    Wanted but not invoked:
detailsView.setFlag(<any string>);
-> at eu.szwiec.countries.details.DetailsPresenterTest.shouldShowFlag(DetailsPresenterTest.java:39)
Actually, there were zero interactions with this mock.

Я пытался использовать также настоящий ведущий без успеха.

2 ответа

Решение

Вы должны использовать настоящий Presenter и объект реальной страны, чтобы вызвать showCountry(), Все остальное не имеет смысла (не тестирование реального презентатора, а фиктивный экземпляр презентатора).

@Test
public void showFlagAndName(){
   DetailsView mockView = mock(DetailsView.class);
   DetailsPresenter presenter = new DetailsPresenter();
   Country country = new Country("Italy", "italyFlag");

   presenter.attachView(mockView);

   presenter.showCountry(country);

   verify(mockView, times(1)).showCountry("Italy");
   verify(mockView, times(1)).setFlag("italyFlag");
}

Вы пытались добавить некоторые записи, чтобы узнать, что происходит?

Я думаю, что вы не попали в реальный метод, как

mockPresenter.showCountry(any(Country.class));

не строит Country экземпляр объекта, но просто проходит null, Итак, состояние

doCallRealMethod().when(mockPresenter).showCountry(any(Country.class));

не встретил Если вы используете менее строгое условие

doCallRealMethod().when(mockPresenter).showCountry(any());

ты должен получить NullPointerException,

Вы можете решить это, используя реальный или издевательский Country экземпляр на вашем вызове метода.

Другие вопросы по тегам