我对为我的GWT应用程序使用正确的模拟框架感兴趣。据我了解,Mockito,EasyMock和jMock是Java中最受欢迎的一些。有人能列出他们最熟悉的与GWT相关的模拟框架的利弊,以帮助其他GWT测试像我这样的菜鸟吗?
提前致谢。
最佳答案
对于服务器端测试(RPC服务),您可以使用所需的任何模拟框架。弹簧测试库对于模拟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应用程序遵循Model View Presenter模式,则可以为GWT客户端代码创建单元测试。假设我们正在测试所谓的“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);
}
}
在“时间”部分而不是button.click()调用presenter.showResult()很有道理,但是您可以看到事件循环的模拟也是可能的。
Google GIN可能非常有用,因为它允许根据运行时/测试上下文来绑定不同的实例。在非GWTTestCase演示者上,测试GIN可以替换为Guice。
com.google.gwt.junit.GWTMockUtilities可能也非常有用。