Для тестирования на стороне сервера (службы RPC) вы можете использовать любую насмешливую структуру. Spring-test library может быть полезной для насмешек HttpRequest, HttpSession и других классов сервлета api. Тем не менее у вас могут возникнуть проблемы с тестированием классов, расширяющих RemoteServiceServlet, поскольку они требуют правильно закодированного запроса. Вот интересный проект, который решает эту проблему:
http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/
Когда дело доходит до тестирования кода на стороне клиента GWT (та часть, которая компилируется в Java Script), вы можете продлить GWTTestCase. Однако из-за ограниченной эмуляции библиотеки JRE, в частности отсутствия API отражения, было бы невозможно использовать какую-либо насмешливую структуру. Более того, время выполнения GWTTestCase очень медленное и по этой причине рассматривается как основа для тестирования интеграции, а не модульного тестирования.
Можно создать модульные тесты для кода клиента GWT, если приложение GWT следует за шаблоном представления модели. Предполагая, что мы тестируем так называемый «Presenter» (логический), мы можем издеваться над так называемым «дисплеем» с любой насмешкой. Вот тестовый модуль Пример использования Mockito:
import static org.mockito.BDDMockito.*;
import org.junit.Test;
import com.google.gwt.user.client.ui.HasText;
public class ResultPresenterTest {
@Test
public void shouldSetItWorksResultText() {
// given
ResultPresenter.Display display = mock(ResultPresenter.Display.class);
MockButton button = new MockButton();
HasText label = mock(HasText.class);
given(display.getShowResultButton()).willReturn(button);
given(display.getResultLabel()).willReturn(label);
ResultPresenter presenter = new ResultPresenter();
presenter.bind(display);
// when
button.click();
// then
verify(label).setText("It works");
}
}
Вот ведущий:
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.user.client.ui.HasText;
public class ResultPresenter {
private Display display;
public interface Display {
HasClickHandlers getShowResultButton();
HasText getResultLabel();
}
public void bind(final Display display) {
this.display = display;
display.getShowResultButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
showResult();
}
});
}
public void showResult() {
display.getResultLabel().setText("It works");
}
}
А вот небольшой вспомогательный класс:
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
public class MockButton implements HasClickHandlers {
private HandlerManager handlerManager = new HandlerManager(this);
public void click() {
handlerManager.fireEvent(new ClickEvent() {
});
}
@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
return handlerManager.addHandler(ClickEvent.getType(), handler);
}
@Override
public void fireEvent(GwtEvent<?> event) {
handlerManager.fireEvent(event);
}
}
Это имело бы смысл называть presenter.showResult() в разделе «когда» вместо кнопки button.click(), однако, как вы можете видеть, насмешка над циркуляцией событий также возможна.
Google GIN может быть очень полезен, поскольку он позволяет связывать разные экземпляры в зависимости от среды выполнения/теста. На тестировщике без GWTTestCase GIN можно заменить на Guice.
Com.google.gwt.junit.GWTMockUtilities также может быть очень полезен.