2011-03-16 67 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); 
    } 

}