2010-08-05 11 views
4

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

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

ответ

7

Для тестирования на стороне сервера (службы 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 также может быть очень полезен.

2

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

Mocking 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