Идея, лежащая в основе модульного тестирования презентатора, заключается в том, чтобы смоделировать представление и написать несколько утверждений относительно состояния этого смоделированного представления, которое будет визуально представлено в реальном приложении. Благодаря такому подходу нет необходимости запускать полный GWTTestCase
, который занимает много времени и должен быть скорее отнесен к категории интеграционного тестирования, а не модульного тестирования.
Если вы попробуете оба подхода MVP, модульные тесты могут выглядеть следующим образом:
MVP 1:
@Test
public void shouldAddContactOnAddContactClicked() {
// given
ContactsPresenter.Display display = mock(ContactsPresenter.Display.class);
MockButton addButton = new MockButton();
given(display.getAddButton()).willReturn(addButton);
ContactsDisplay.Presenter presenter = new ContactsPresenter();
presenter.bindView(display);
presenter.setContacts(new ArrayList<Contact>());
// when
addButton.click();
// then
verify(display).addContact(any());
assertThat(presenter.getContacts().size(), is(1));
}
Где MockButton
- это то, что я описал здесь:
Комплексные плюсы / минусы Mocking Frameworks для GWT
Хотя это возможно, на самом деле это не очень удобно для насмешек. Подход MVP2, кажется, работает лучше:
@Test
public void shouldAddContactOnAddContactClicked() {
// given
ContactsView view = mock(ContactsView.class);
ContactsView.Presenter presenter = new ContactsPresenter();
presenter.bindView(view); // assuming that presenter will call view.setPresenter(this)
presenter.setContacts(new ArrayList<Contact>());
// when
presenter.onAddContactClicked();
// then
verify(view).addContact(any());
assertThat(presenter.getContacts().size(), is(1));
}
Другой причиной использования второго подхода является проблема в MVP1 с объявлением элементов дисплея, которые будут вызывать различные события (например, ClickEvent, FocusEvent). MVP2 также облегчает работу, когда дело доходит до UiBinder
.