2011-03-16 85 views
4

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

与测试servlet的自然挑战是:

  1. 启动Web服务器,
  2. 模拟客户端,
  3. 的Servlet立即返回,传递价值的AsyncCallback对象。

到目前为止,我已经能够找出(尽管这仍是未测试),即:通过扩展GWTTestCase 3.我已经找到了谷歌文档有关asynchronous testing 1.我可以启动容器,所以有可能等待作为异步回调。谷歌文档也提到这一点:

服务器端测试

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

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

我还没有想出如何模拟客户端......任何想法我该怎么做?

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

谢谢!

回答

4

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

有一个叫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); 
    } 

}