2010-02-11 52 views
4

我在Maven項目B(它是項目A的子項)中的測試代碼類似於從Maven獲取JUnit測試用例中最簡單的文件的方法

String filePath = "src/main/webapp"; 
//do something with the filePath 

當我從child(即B級)運行項目時,上面的測試用例運行正常但是當我運行時來自父項目A(即,在父級別進行mvn安裝),這會失敗,因爲很明顯在父級別下沒有名爲「src/main/webapp」的文件夾(但是在子級別可用)。

我知道我可以做一些編碼檢查測試用例是否從父/子模塊運行,但顯然我想知道其他在遇到這個問題時做了什麼?

不,我不能使用類路徑(出於各種無聊的原因)。

我也試過相對路徑,但後來測試用例開始知道太多了。實際上有解決方案嗎?

UPDATE(12/Feb) - 我在webapp文件夾下有一個web.xml,並使用該web.xml在測試用例中創建一個jetty服務器。理想情況下,src/main/webapp不會放在類路徑中。 WAR插件使用它來打包WAR。現在,我嘗試了另一種方法,我將web.xml放在src/main/resource/console-webapp/WEB-INF/web.xml目錄中,並更改了maven war插件中的webXml屬性。這似乎解決了我的問題。但是,在輸出WAR中我有一個web.xml和另一個冗餘web.xml(由於它在類路徑中而被複制)。

我嘗試過「packageExcludes」和「webResources/excludes」,並獲得了war插件,省略了第二個web.xml,但仍然複製了目錄「console-webapp」(儘管是空的)。有沒有辦法告訴maven war插件完全忽略一個目錄(即什麼是螞蟻模式?)

+1

Maven 2測試是在單獨的進程中的module目錄下運行的。這意味着「src/main/webapp」應該可以很好地工作,無論它從哪裏被調用。你在用surefire插件進行測試嗎? JUnit/TestNG?你有沒有禁用forfire? – artemb 2010-02-11 12:19:11

回答

7

Maven 2約定規定,所有的測試資源,包括文件,如你正在嘗試在您的測試中使用,必須存儲在src/test/resources文件夾中。如果你遵守這個約定,你將能夠直接從類路徑中獲取你的文件。這些資源將而不是包含在最終包裝(JAR,WAR,EAR ...)中。

當然,你可以改變目錄,然後在你的pom.xml指定新的測試資源目錄:

<build> 
    <testResources> 
     <testResource> 
      <directory>...</directory> 
     </testResource> 
    </testResources> 
    ... 

在你的問題,你指定了不能使用的類路徑。爲什麼這樣?

+1

+1提到按慣例,所有測試資源都應該進入src/test/resources。 – 2010-02-11 12:26:17

+1

以上是真實的,但OP很可能不會嘗試加載測試資源,而是來自webapp的文件。 – 2010-02-11 16:10:47

+0

帕斯卡你是對的。我用我的研究結果中的一些細節更新了這個問題。謝謝 :) – 2010-02-12 10:56:33

2

是您試圖在測試類路徑上訪問的文件嗎?如果是這樣的話,怎麼樣:

public class IOUtils { 

    public URL getResourceAsURL(String resource) { 
    ClassLoader cl = getClass().getClassLoader(); 
    return cl.getResource(resource); 
    } 


    public static InputStream getResourceAsStream(String resource) throws IOException { 
    ClassLoader cl = getClass().getClassLoader(); 
    InputStream in = cl.getResourceAsStream(resource); 

    if (in == null) 
     throw new IOException("resource \"" + resource + "\" not found"); 

    return in; 
    } 
}