GWT模拟框架的综合优势/缺点

我有兴趣为我的GWT应用程序使用正确的模拟框架。 据我所知,Mockito,EasyMock和jMock是Java最受欢迎的一些。 有人可以列出他们最熟悉的模拟框架的优缺点,因为它与GWT有关,可以帮助GWT测试像我这样的人吗?

提前致谢。

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

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

在测试客户端GWT代码(编译成Java Script的部分)时,可以扩展GWTTestCase。 但是由于JRE库的仿真有限,特别是缺少reflectionAPI,因此不可能使用任何模拟框架。 更重要的是,GWTTestCase运行时非常慢,因此考虑作为集成测试的基础而不是unit testing。

如果GWT应用程序遵循模型视图展示器模式,则可以为GWT客户端代码创建unit testing。 假设我们正在测试所谓的“Presenter”(逻辑),我们可以使用任何模拟框架来模拟所谓的“显示”。 以下是使用Mockito的示例unit testing:

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); } } 

在’when’部分而不是button.click()中调用presenter.showResult()是有意义的,但是你可以看到事件循环的模拟也是可能的。

Google GIN可能非常有用,因为它允许根据运行时/测试上下文绑定不同的实例。 在非GWTTestCase演示者测试中,GIN可以用Guice替换。

com.google.gwt.junit.GWTMockUtilities可能也非常有用。

我们很高兴在我们的GWT项目中使用Gwt-test-utils 。

使用mockito模拟RPC调用非常简单:

首先,在测试中声明您的模拟服务:

 @Mock private ServiceAsync service; 

那么当你想模拟一个成功的回调:

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

更多相关信息: http : //code.google.com/p/gwt-test-utils/wiki/MockingRpcServices