如何为GWT servlet编写测试?

时间:2011-03-16 16:58:24

标签: unit-testing gwt servlets gwt-rpc

我有一个GWT应用程序,服务器端的servlet很少。我想测试这些servlet(不需要使用Selenium或任何其他基于Web的框架进行GUI测试)。或者换句话说,我希望测试模拟GWT的客户端。

测试servlet的自然挑战是:

  1. 启动网络服务器,
  2. 模拟客户端,
  3. Servlets立即返回,将值传递给AsyncCallback对象。
  4. 到目前为止,我已经能够弄清楚(虽然这仍未经过测试),那: 1.我可以通过扩展GWTTestCase来启动容器 3.我找到了关于asynchronous testing的Google文档,因此可以等待进行异步回调。 Google文档也提到了这一点:

      

    服务器端测试

         

    上述测试旨在帮助测试客户端代码。测试用例包装器GWTTestCase将启动开发模式会话或Web浏览器以测试生成的JavaScript。另一方面,服务器端代码在JVM中作为本机Java运行而不转换为JavaScript,因此不必使用GWTTestCase作为测试的基类来运行服务器端代码的测试。相反,在为应用程序的服务器端代码编写测试时,直接使用JUnit的TestCase和其他相关类。也就是说,您可能希望GWTTestCase和TestCase覆盖将在客户端和服务器上使用的代码。

    但是没有例子或更深入的解释如何实现这一点。

    我还没弄明白如何模拟客户端...任何想法我该怎么做?

    或者,如果这不是这样做的方式,还有其他方法吗?我更喜欢使用本机GWT类,而不是一些第三方框架来测试servlet。

    谢谢!

1 个答案:

答案 0 :(得分:4)

如何使用嵌入式Jetty实例......无论如何,Jetty服务器都包含在GWT SDK中。因此,只需在项目中包含gwt-dev.jar,然后转到服务器端。模仿客户端是一个完全不同的故事。问题是在GWT魔术中发生的JavaScript到Java序列化/反序列化....

有一个名为gwt-syncproxy的项目可以在这里提供帮助: http://code.google.com/p/gwt-syncproxy/

在代码中,这可能如下所示:

import junit.framework.Assert;

import org.junit.BeforeClass;
import org.junit.Test;

import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;

import com.gdevelop.gwt.syncrpc.SyncProxy;

public class ServletTest {

    private Server _server;

    @BeforeClass
    public void setUp() throws Exception {
        _server = new Server(8080);
        Context root = new Context(_server, "/", Context.SESSIONS);
        root.addServlet(new ServletHolder(new MyServiceImpl()), "/servlet");
        _server.start();
    }

    @Test
    public void testMethod1() throws Exception {
        MyService rpcService = (MyService) SyncProxy.newProxyInstance(MyService.class, "http://127.0.0.1:8080/servlet", "testMethod1");

        String result = rpcService.testMethod1();

        Assert.assertTrue(result != null);
    }

}