2011-03-10 64 views
4

我一直試圖通過在JUnit測試用例的BeforeClass方法中啓動Jetty服務器來測試我的Web應用程序,然後使用HttpClient向服務器形成請求。我讓服務器在沒有任何問題的情況下啓動,但當我嘗試提出請求時,我一直在獲取404。在JUnit測試中使用Jetty服務器

我的服務器的配置是這樣的:

public void start() throws Exception { 
     if (server == null) { 
      server = new Server(PORT); 
      server.setStopAtShutdown(true); 

      wac = new WebAppContext(); 
      wac.setContextPath("/app"); 
      wac.setResourceBase("war"); 
      wac.setClassLoader(this.getClass().getClassLoader()); 
      server.addHandler(wac); 

      server.start(); 
     } 
    }  

是不是有什麼毛病我的配置?服務器正在運行,我可以看到我正在打它,它找不到任何資源。

回答

3

您可能需要將此servlet定義爲部署描述符(web.xml或jetty-web.xml)中的資源。只是一個猜測; 404代表你的代碼根本沒有運行,因此不是問題。在您的代碼甚至有機會執行之前,問題就會發生。

+0

ahaha是的,我知道的通知wac.getDescriptor返回null。 – stevebot 2011-03-11 00:22:47

0

我想你忘記了設置:

wac.setWar("/path/to/war/file"); 

或者更好,使用構造函數:

wac = new WebAppContext("/path/to/war/file", "/app"); 
+1

我設置了資源庫和類加載器,因此戰爭的路徑被自動設置。如果我在運行時檢查WebAppContext,這至少是我看到的行爲。 – stevebot 2011-03-11 00:34:11

6

我開始在第一篇文章的代碼片段,然後開始通過打我的方式。下面的代碼終於爲我工作:

Server server = new Server(8080); 
server.setStopAtShutdown(true); 

WebAppContext webAppContext = new WebAppContext(); 
webAppContext.setContextPath("/app"); 
webAppContext.setResourceBase("src/main/webapp");  
webAppContext.setClassLoader(getClass().getClassLoader()); 
server.addHandler(webAppContext); 
server.start(); 

URL url = new URL("http://localhost:8080/app/some_call"); 
URLConnection connection = url.openConnection(); 
List<String> lines = IOUtils.readLines(connection.getInputStream()); 
System.out.println(lines.get(0)); 

POM看起來是這樣的:

<dependency> 
    <groupId>org.mortbay.jetty</groupId> 
    <artifactId>jetty</artifactId> 
    <version>${jetty.version}</version> 
</dependency> 
<dependency> 
    <groupId>org.mortbay.jetty</groupId> 
    <artifactId>jetty-util</artifactId> 
    <version>${jetty.version}</version> 
</dependency> 


<jetty.version>6.1.25</jetty.version> 
+1

我必須在'server.addHandler(webAppContext);'之後添加'server.start();'。 – letmaik 2013-03-26 14:18:59

13

這是使用碼頭一個完整的JUnit測試類:

package test.server; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.mortbay.jetty.Server; 
import org.mortbay.jetty.webapp.WebAppContext; 

public class MockPortalTest { 

    private Server server; 

    @Before 
    public void startServer() throws Exception { 
     server = new Server(8080); 
     server.setStopAtShutdown(true); 
     WebAppContext webAppContext = new WebAppContext(); 
     webAppContext.setContextPath("/app"); 
     webAppContext.setResourceBase("src/main/webapp");  
     webAppContext.setClassLoader(getClass().getClassLoader()); 
     server.addHandler(webAppContext); 
     server.start(); 
    } 


    @Test 
    public void shouldBePreAuthenticated() throws Exception { 
     String userId = "invalid"; 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet mockRequest = new HttpGet("http://localhost:8080/app"); 
     mockRequest.setHeader("http-user",userId); 
     HttpResponse mockResponse = client.execute(mockRequest); 
     BufferedReader rd = new BufferedReader 
      (new InputStreamReader(mockResponse.getEntity().getContent()));  
     // DO YOUR ASSERTIONS 
    } 

    @After 
    public void shutdownServer() throws Exception { 
     server.stop(); 
    } 

}