Для тестирования на стороне сервера (службы RPC) вы можете использовать любую фиктивную среду, которую пожелаете. библиотека spring-test может быть полезна для имитации 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 следует шаблону Model View Presenter. Предполагая, что мы тестируем так называемый «Presenter» (логика), мы можем издеваться над так называемым «Display» с любой имитирующей структурой. Вот пример модульного теста с использованием 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() в секции 'when' вместо button.click(), однако, как вы можете видеть, возможно имитирование циркуляции событий.
Google GIN может быть очень полезен, так как позволяет связывать разные экземпляры в зависимости от среды выполнения/контекста теста. В тесте презентатора без GWTTestCase GIN можно заменить на Guice.
com.google.gwt.junit.GWTMockUtilities также может быть очень полезным.
person
Community
schedule
07.08.2010