当前位置: 首页 > 面试题库 >

GWT模拟框架的全面利弊

卫嘉言
2023-03-14
问题内容

我对为我的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可能也非常有用。



 类似资料:
  • 主要内容:GWT 日志框架 介绍,记录器的类型,日志处理程序, GWT 日志框架 示例GWT 日志框架 介绍 日志框架模拟 java.util.logging,因此它使用与服务器端日志代码相同的语法和行为 GWT 日志记录是使用 .gwt.xml 文件配置的。 我们可以配置启用/禁用日志记录;我们可以启用/禁用特定处理程序,并更改默认日志记录级别。 记录器的类型 记录器以树结构组织,根记录器位于树的根部。 记录器的名称使用 确定父/子关系。分隔名称的各个部分。 例如,如果我们有两个

  • 如何模拟AsNoTracking方法? 在下面的示例中,DbContext已经注入到服务类中,如果我从GetOrderedProducts方法中移除AsNoTracking扩展方法,它可以正常工作,但是with AsNoTracking测试失败,因为它返回null。我还试图模拟AsNoTracking以返回正确的值,但它不起作用。

  • 1. 前言 通过几个章节的学习,大家对于 Spring 已经有了初步的认知,我们通过案例练习,或者源码追踪,可以粗略的看到 Spring 框架初始化 bean 对象的过程,那么这个章节,我们模拟 Spring 框架的思路,来写一个类似 Spring 加载对象的案例,加深大家的印象。 2. 案例实现思路 2.1 步骤介绍 思路分析: 我们通过写过的案例可以知道: Spring 框架的容器 是一个接口

  • 本文向大家介绍python模拟Django框架实例,包括了python模拟Django框架实例的使用技巧和注意事项,需要的朋友参考一下 一、python实现web服务器 web开发首先要有web服务器才行。比如apache,但是在开发阶段最好有一个简单方便的开发服务器, 容易重启进行调试,等开发调试完毕后,再将代码部署到成熟稳定高效的web服务器。 执行上面这个程序后,打开浏览器,访问一个以 ht

  • 问题内容: 我正在寻找有关如何使用GWT 2.1编辑器框架的 文档或示例。Google的文档非常少。 从有限的可用文档中,我已经能够得知,编辑器(理论上)将使您能够更轻松地将GUI元素绑定到数据模型。这将减轻将数据复制到TextArea / ListBox / CheckBox,然后将用户的更改复制回基础模型(最终是数据库)的非常常见的任务。 如果确实做到了这一点,将非常受欢迎。目前,我还不知道如