Всесторонние плюсы и минусы Mocking Frameworks для GWT

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

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


person Community    schedule 05.08.2010    source источник


Ответы (2)


Для тестирования на стороне сервера (службы 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

Мы с радостью используем 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

person Community    schedule 01.03.2012