2010-08-05 65 views
4

我有兴趣为我的GWT应用程序使用正确的嘲笑框架。我的理解是Mockito,EasyMock和jMock是Java中最受欢迎的程序。是否有人列出了他们最熟悉的模拟框架的优点/缺点,因为它与GWT有关,可以帮助像我这样的GWT测试noobs?GWT嘲笑框架的综合优点/缺点

在此先感谢。

回答

7

对于服务器端测试(RPC服务),您可以使用任何您希望的模拟框架。 spring-test库可能会用于模拟HttpRequest,HttpSession和其他类的servlet api。您仍然可能在扩展RemoteServiceServlet的测试类时遇到问题,因为它们需要正确编码的请求。这是有趣的项目,它解决了这个问题:

http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/

当涉及到的客户端GWT代码(编译为Java脚本的部分)的测试,你可以扩展GWTTestCase。然而,由于JRE库的模拟有限,特别是缺乏反射API,所以不可能使用任何模拟框架。更重要的是,GWTTestCase运行时非常慢,因此考虑作为集成测试的基础而不是单元测试。

如果GWT应用程序遵循模型视图展示器模式,则可以为GWT客户端代码创建单元测试。假设我们正在测试所谓的“演示者”(逻辑),我们可以用任何模拟框架来嘲笑所谓的“显示”。下面是使用例子的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可能也非常有用。

2

我们很高兴为我们的GWT项目使用Gwt-test-utils

嘲讽的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