Комплексные плюсы и минусы Mocking Frameworks для GWT - PullRequest
4 голосов
/ 05 августа 2010

Я заинтересован в использовании подходящей среды для моего приложения GWT. Насколько я понимаю, Mockito, EasyMock и jMock являются одними из самых популярных для Java. Может ли кто-нибудь перечислить плюсы / минусы для насмешливого фреймворка, с которым он наиболее знаком, так как он имеет отношение к GWT, чтобы помочь таким же GWT-тестировщикам, как я?

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 07 августа 2010

Для тестирования на стороне сервера (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 () в разделе «когда» вместо button.click (), однако, как вы можете видеть, также возможно издеваться над распространением событий.

Google GIN может быть очень полезным, так как это позволяетсвязывать разные экземпляры в зависимости от среды выполнения / тестового контекста.В тесте не GWTTestCase Presenter GIN можно заменить на Guice.

Также может быть очень полезен com.google.gwt.junit.GWTMockUtilities.

2 голосов
/ 01 марта 2012

Мы с радостью используем Gwt-test-utils для нашего проекта GWT.

Пересмешивать вызовы RPC с помощью mockito очень просто:

Сначала вы объявляете насмешкуслужба в вашем тесте:

@Mock
private ServiceAsync service;

затем, когда вы хотите смоделировать успешный обратный вызов:

doSuccessCallback(result).when(service).myMethod(eq("argument"), any(AsyncCallback.class));

Подробнее об этом: http://code.google.com/p/gwt-test-utils/wiki/MockingRpcServices

...