4

我有兴趣为我的 GWT 应用程序使用正确的模拟框架。据我了解,Mockito、EasyMock 和 jMock 是 Java 中最流行的一些。有人可以列出他们最熟悉的模拟框架的优缺点,因为它与 GWT 相关,以帮助像我这样的 GWT 测试新手?

提前致谢。

4

2 回答 2

7

对于服务器端测试(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 库的模拟有限,特别是缺少反射 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);
    }

}

在“when”部分而不是 button.click() 中调用 presenter.showResult() 是有意义的,但是正如您所见,也可以模拟事件循环。

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

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

于 2010-08-07T00:34:41.050 回答
2

我们很高兴将Gwt-test-utils用于我们的 GWT 项目。

使用 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

于 2012-03-01T14:30:58.497 回答