首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GWT模拟框架的综合利弊

GWT模拟框架的综合利弊
EN

Stack Overflow用户
提问于 2010-08-06 01:44:18
回答 2查看 1.9K关注 0票数 4

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

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-07 08:34:41

对于服务器端测试(RPC服务),您可以使用任何想要的模拟框架。spring测试库对于模拟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“(逻辑),我们可以用任何mocking框架来模拟所谓的"Display”。下面是使用Mockito进行单元测试的示例:

代码语言:javascript
运行
复制
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");
    }

}

以下是演示者:

代码语言:javascript
运行
复制
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");
    }

}

下面是一个小的助手类:

代码语言:javascript
运行
复制
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‘部分调用presenter.showResult()而不是button.click()是有意义的,但是你可以看到模拟事件循环也是可能的。

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

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

票数 7
EN

Stack Overflow用户

发布于 2012-03-01 22:30:58

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

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

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

代码语言:javascript
运行
复制
@Mock
private ServiceAsync service;

然后,当你想模拟一个成功的回调时:

代码语言:javascript
运行
复制
doSuccessCallback(result).when(service).myMethod(eq("argument"), any(AsyncCallback.class));

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3417551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档