2010-05-26 38 views
9

如何在Maven/Surefire unittest運行「mvn test」期間使清單可用?如何在Maven/Surefire unittest運行「mvn測試」期間使清單可用?

我有一個開源項目,我正在從Ant轉換到Maven,包括它的單元測試。這裏是Maven項目的項目源代碼倉庫: http://github.com/znerd/logdoc

我的問題與主模塊有關,稱爲「base」。該模塊具有單元測試,用於測試類org.znerd.logdoc.Library中的靜態方法getVersion()的行爲。此方法返回:

Library.class.getPackage().getImplementationVersion() 

getImplementationVersion()方法返回清單文件中設置的值。到現在爲止還挺好。我已經在過去測試了它,並且它運行良好,只要該清單在類路徑中的路徑META-INF/MANIFEST.MF(無論是在文件系統上還是在JAR文件內)上都可用。

現在我的挑戰是,清單文件不可用,當我運行單元測試:

mvn test 

神火運行單元測試,但我的單元測試失敗,表明Library.getVersion()返回null一個mesage。

當我想檢查JAR時,發現它還沒有生成。 Maven/Surefire在之前將資源添加到類路徑中,然後對類進行單元測試,

進一步的調查顯示Surefire在一個臨時目錄中生成它自己的JAR文件,例如,

/private/var/folders/TR/TREvj1wIHYyAcUy-xmc3UU+++TI/-Tmp-/surefirebooter7448562488934426857.jar 

然後使用這個JAR來加載庫類。此JAR不包含我卡在src/main/resources下的資源。所以把一個META-INF/MANIFEST.MF文件也不起作用。

那麼我該如何告訴Surefire我的META-INF/MANIFEST.MF文件可以從Library類的相同類加載器中獲得。

請注意,我在Mac OS X 10.6.2上使用Maven 2.2.0,Java 1.6.0_17和JUnit 4.8.1。

回答

2

那麼,你指出你的問題是,MANIFEST.MF期間package產生直接包含在最終的罐子和test後這一切發生。所以,我想你必須要麼:

  • 提供your own MANIFEST.MF(這將是提供target/classes期間package被合併之前)。我不知道這是否是一種選擇(如果它能起作用)。
  • 根據JAR放置並運行來自另一個模塊的測試。
+0

帕斯卡,非常感謝你的回答。我試了兩個: 當我添加一個文件src/main/resources/META-INF/MANIFEST.MF,我運行mvn clean test然後該文件被複制到target/classes/META-INF/MANIFEST.MF,但它仍然顯然不能訪​​問單元測試。 當我依賴於來自同一項目中另一個模塊的JAR時,則不使用JAR,而是使用生成的classes目錄。我爲此創建了issue report SUREFIRE-620。 – 2010-05-31 20:10:05

+0

@Ernst嗯,我沒有幫助,但歡迎你:)我對第一個解決方案有一個很大的疑問,但看起來我對第二個解決方案太有信心了。感謝您發佈Jira問題,這是一個有趣的案例。 – 2010-05-31 20:37:52

+0

我做了一些更多的調查並更新了問題。我會做更多的搜索。也許一個「尋找額外的類路徑 - 在這裏」類指令將工作。 – 2010-06-01 20:17:25

相關問題