2012-10-08 89 views
2

我在一個實現了Web服務的多模塊Maven項目(比如foo-web)中有一個WAR模塊。然後我有一個foo-cli,它實現了一個Web服務客戶端並在幾個單元測試中對它進行測試。在Maven多模塊項目的測試階段之前啓動Jetty

爲了使這一工作,我在測試階段開始前碼頭是這樣的:

<dependency> 
    <groupId>${project.groupId}</groupId> 
    <artifactId>foo-web</artifactId> 
    <version>${project.version}</version> 
    <type>war</type> 
    <scope>test</scope> 
</dependency>   
... 
<plugin> 
<groupId>org.mortbay.jetty</groupId> 
<artifactId>jetty-maven-plugin</artifactId> 
<version>8.1.5.v20120716</version> 
    <configuration> 

    <scanIntervalSeconds>10</scanIntervalSeconds> 
    <useTestScope>true</useTestScope> 
    <connectors> 
     <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> 
     <port>8080</port> 
     <maxIdleTime>60000</maxIdleTime> 
     </connector> 
    </connectors> 
    </configuration> 

<executions> 
    <execution> 
     <id>start-jetty</id> 
     <phase>process-test-classes</phase> 
     <goals> 
     <goal>run</goal> 
     </goals> 
     <configuration> 
     <scanIntervalSeconds>0</scanIntervalSeconds> 
     <daemon>true</daemon> 
     </configuration> 
    </execution> 
    </executions>   
</plugin> 

這工作得很好,而我來自於Foo-CLI模塊(它甚至站內運行「MVN測試」自動,無需指定其他任何內容)。但是,當我嘗試去上一級(foo)並從那裏發出'mvn test'時,即嘗試運行項目中所有模塊的所有測試時,它會以'404 - 未找到'的方式失敗。從輸出中,我可以看到覆蓋(戰爭依賴)似乎完全被忽略。

在此先感謝您的幫助。

回答

3

您應該嘗試將您的集成測試移至頂級項目。這種方式將在WAR構件生成後運行。

你看過Maven Failsafe Plugin嗎?它是爲你正在做的事情而設計的,這實際上是一個集成測試,而不是單元測試。該頁面提供了一些很好的建議,說明爲什麼您可能希望使用integration-test階段進行集成測試。

即,它描述了爲什麼你可能想在pre-integration-teststart-jetty等,以便你可以適當撕下它。

+0

謝謝喬納森。我見過Failsafe,但我相信我在這裏對Web服務客戶端進行單元測試,而不是進行集成測試,所以我想讓它工作。 此外,如果我必須轉移到Failsafe,那麼通過客戶端調用Web服務的代碼將如何?目前它是一個JUnit註釋的類。 – zakmck

+0

如果您轉移到故障安全模式,您的配置將類似。你會在'pre-integration-test'階段執行'start-jetty'任務,而不是'process-test-classes'。然後做失敗保險,然後在'post-integration-test'中做'stop-jetty',最後做一個'verify'任務。 – Jonathan

+0

是的,但是如何實現Junit測試的Java類呢?這是調用Web服務的一個。如果使用JUnit(即@Test)註釋它,Maven如何理解這是一個集成測試而不是單元測試?我知道如果surefire試圖運行它,它不會找到運行的web服務器,因爲這會在稍後啓動。我錯過了什麼? – zakmck

相關問題