Тестирование Мосби с Мокито
Я использую 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
экземпляр на вашем вызове метода.