2013-12-16 47 views
2

我正嘗試使用嵌入式碼頭來自動測試Web服務。但是,當我嘗試訪問服務時,我不斷收到錯誤404。嵌入式碼頭用於自動化測試

這是我的src /主/ web應用/ WEB-INF/web.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
id="WebApp_ID" version="2.5"> 
<display-name>Snafucator</display-name> 

<session-config> 
    <session-timeout>60</session-timeout> 
</session-config> 

<context-param> 
    <param-name>webAppRootKey</param-name> 
    <param-value>Snafucator</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:snafucator.service.xml</param-value> 
</context-param> 

<servlet> 
    <servlet-name>jaxws-servlet</servlet-name> 
    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jaxws-servlet</servlet-name> 
    <url-pattern>/Snafucator</url-pattern> 
</servlet-mapping> 

我也希望我的src /測試/資源在類路徑,因爲它們含有的設置DAO和實現該服務的其他組件。該服務所需的所有bean都在snafucator.service.xml中配置。這主要通過加載幾個spring上下文文件來實現。這些是從較低層文件和定義該服務綁定和執行snafucator.context.xml:

<import resource="classpath*:setup.context.xml" /> 
<import resource="classpath*:core.context.xml" /> 
<import resource="classpath*:snafucator.context.xml" /> 

Morever,我需要的類路徑上目標/類,因爲它包含了snafucator.context.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:ws="http://jax-ws.dev.java.net/spring/core" xmlns:wss="http://jax-ws.dev.java.net/spring/servlet" 
xmlns:security="http://www.springframework.org/schema/security" 
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation=" 
http://www.springframework.org/schema/util 
http://www.springframework.org/schema/util/spring-util-3.0.xsd 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
http://www.springframework.org/schema/security 
http://www.springframework.org/schema/security/spring-security-3.0.xsd 
http://jax-ws.dev.java.net/spring/core 
http://jax-ws.dev.java.net/spring/core.xsd 
http://jax-ws.dev.java.net/spring/servlet 
http://jax-ws.java.net/spring/servlet.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<!-- enable autowiring by annotations --> 
<context:annotation-config /> 

<wss:binding url="/Snafucator"> 
    <wss:service> 
     <ws:service bean="#snafucatorWs" /> 
    </wss:service> 
</wss:binding> 
<bean id="snafucatorWs" class="com.snafu.SnafucatorWSImpl" /> 

我這是怎麼開始的碼頭:

server = new Server(iPort); 
WebAppContext root = new WebAppContext(); 
root.setExtraClasspath("target/classes/,src/test/resources/"); 
root.setDescriptor("src/main/webapp/WEB-INF/web.xml"); 
root.setResourceBase("src/main/webapp");  
root.setWar("src/main/webapp"); 
root.setContextPath("/");  
root.setServer(server); 
root.setParentLoaderPriority(true); 
server.setHandler(root); 

System.out.println("Starting jetty server on port:" + iPort); 
server.start(); 
System.out.println("Jetty server is started!"); 

當我訪問"http://localhost:8082"時,我看到WEB-INF和META-INF目錄,因此Jetty正在運行。當我嘗試"http://localhost:8082/Snafucator"時,出現錯誤404,命令行顯示「JAX-WS-Servlet已初始化」。當我訪問"http://localhost:8082"下的任何其他url時,我會得到一個稍微不同的格式化的404。所以我假設有一些WS處理髮生。 我也在開發一個Web應用程序,該服務被設計爲其中的一部分。當我將snafucator.context.xml包含到應用程序的上下文中並使用jetty eclipse插件啓動應用程序時,一切正常。但是對於自動化測試,我需要單獨啓動服務。

順便說一下,我使用的是Jetty 7.6.14。

我在做什麼錯?

+0

我不確定root.setWar()在這種情況下工作。如果你有興趣,我可以發佈我的嵌入Jetty沒有WAR的方式完美的測試和使用彈簧。 – JosefN

+0

嗨JosefN,我已經看到了這種使用setWar在這裏的各種地方http://stackoverflow.com/questions/3718221/add-resources-to-jetty-programmatically或這裏https://today.java.net/pub /a/today/2007/04/12/embedded-integration-testing-of-web-applications.html,其中setWar由WebAppContext的構造函數調用。但我不在乎它是如何工作的,只要它有效:-)所以,如果你有一個運行的例子,我會很高興嘗試一下。 – avidD

回答

0

不幸的是,您的解決方案對我無效。我認爲這不是我正在尋找的。特別是,我想從現有的web.xml開始。無論如何,謝謝。然而,我發現了一個解決方案,在我的情況下工作:

@Override 
    public void start() throws Exception { 
    // Set up the handler for the web application context. 
    WebAppContext root = new WebAppContext(); 
    root.setExtraClasspath(extraClassPath); 
    root.setDescriptor(new File(appDir, "WEB-INF/web.xml").getAbsolutePath()); 
    root.setWar(new File(appDir).getAbsolutePath()); 
    root.setContextPath(contextPath); 
    root.setParentLoaderPriority(true); 
    server.setHandler(root); 
    server.start(); 
    System.out.println("Jetty server is started!"); 
    } 

我認爲唯一改變的是,我沒有設置resourceBase。這現在工作很好。

乾杯

2

抱歉延誤。我使用沒有WAR的嵌入式碼頭。以下是Jetty的簡單包裝。您可以通過上下文的開始或使用

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "path/testContext.xml" }) 

包裝類

public class JettyWrapper extends Server implements ApplicationContextAware { 
     private ApplicationContext appContext; 

@Override 
protected void doStart() throws Exception { 

    final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    final GenericWebApplicationContext webApplicationContext = new GenericWebApplicationContext(); 
    webApplicationContext.setServletContext(context.getServletContext()); 
    webApplicationContext.setParent(appContext); 
    context.getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext); 
    webApplicationContext.refresh(); 
    DispatcherServlet dispatcherServlet = new DispatcherServlet(); 
    dispatcherServlet.setContextConfigLocation("classpath:servlet-context.xml"); 
    context.addServlet(new ServletHolder(dispatcherServlet), "/*"); 
    context.setContextPath("/"); 
    setHandler(context); 
    super.doStart(); 
} 

@Override 
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
    this.appContext = applicationContext; 
} 

的情況下測試手動啓動它:

<bean id="webServer" class="package.JettyWrapper" 
    destroy-method="stop" init-method="start"> 
    <property name="connectors"> 
     <list> 
      <bean id="Connector" class="org.eclipse.jetty.server.nio.SelectChannelConnector"> 
       <property name="port" value="${jetty-port}" /> 
      </bean> 
     </list> 
    </property> 

希望它有助於