2009-09-09 54 views
3

作爲我當前項目的一部分,我創建了自定義類加載器。部分自定義加載程序的單元測試涉及使用一些JAR文件來演示加載程序的正確行爲。使用Maven爲單元測試自定義類加載器構建單獨的JAR文件

我想在運行實際單元測試之前從Java源創建測試JAR文件。此外,運行單元測試時,測試JAR文件不能位於類路徑中,因爲我想在測試執行期間動態加載它們。

是否存在一種標準模式來完成這種「在測試階段之前建立一些JAR但保留在類路徑之外」的要求?我無法相信我是第一個嘗試用Maven 2做這件事的人,但我似乎無法擊中正確的POM結構和依賴關係。通常我最終會得到一些在測試階段之前未構建的測試罐,但是我也遇到了不一致的構建順序問題,導致構建在一臺機器上正常工作,但未能構建一些在另一個測試罐子。

+0

不知道我理解這個問題的內容。你想在測試執行之前從某些特定的測試類中創建一個jar嗎? – 2009-09-09 20:40:07

+0

你的測試不完全是一個單元測試。它不測試一個孤立的單元,而是整合多個單元(你的類加載器,java類加載器,文件io)。 – 2009-09-09 20:47:24

+0

您可以添加測試和集成測試以獲得更多回復。 – 2009-09-09 20:49:09

回答

5

最簡單的做法是設置另一個項目來打包測試jar包的類,然後將其設置爲正常的test-scoped依賴項。

如果您不想/不能這樣做,您可以使用程序集插件在process-test-classes階段(即在測試已編譯但未執行測試之前)創建一個jar。下面的配置將調用程序集插件,在目標目錄中創建一個名爲classloader-test-deps的jar。然後您的測試可以根據需要使用該jar。

程序集插件使用包含target/test-classes內容的程序集描述符(在src/main/assembly中稱爲test-assembly.xml)。我設置了一個過濾器來包含com.test包及其子項的內容。這假設你有一些包名稱約定,你可以申請jar的內容。

程序集插件默認將jar作爲附加工件,通過指定attach爲false,它不會被安裝/部署。

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-2</version> 
    <executions> 
    <execution> 
     <id>create-test-dependency</id> 
     <phase>process-test-classes</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <finalName>classloader-test-deps</finalName> 
     <attach>false</attach> 
     <descriptors> 
      <descriptor>src/main/assembly/test-assembly.xml</descriptor> 
     </descriptors> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

這是測試assembly.xml

<assembly> 
    <id>test-classloader</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.testOutputDirectory}</directory> 
     <outputDirectory>/</outputDirectory> 
     <!--modify/add include to match your package(s) --> 
     <includes> 
     <include>com/test/**</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
</assembly> 
+0

適當的依賴關係確實是測試範圍的。 您提出的裝配插件方法有承諾。我會給它一個旋轉! – rtenhove 2009-09-09 22:18:15

+0

富貴賣家:這兩個答案都證明是正確的。由於我自己的一些愚蠢,我設法巧妙地打破了生成測試瓶的POM。一旦修復,測試範圍按預期工作,儘管Maven給我的線索使修復非常困難。 我也試過了程序集插件,它工作得很好。它的靈活性可能證明在更復雜的情況下非常有用。 – rtenhove 2009-09-14 18:12:56

5

我會嘗試在測試中設置您的測試需要的所有內容。主要優點是沒有看不見的魔術看不見的設置。測試可以在每個環境中運行。此外,添加新的嚴格隔離的場景要容易得多,因爲您不依賴於某些混合場景設置。

的設置應該不會太難:

  • 連載的Java類:
    • 某種類型的代碼工程庫
    • 另外,使用重命名爲比其他一些文件後綴Java類文件。類。將其置於測試資源文件夾下並使用類加載器(getResourceAsStream(...))加載。
  • 壓縮類文件(`java.util.zip.GZIPOutputStream`)
  • 加載類文件與你的類加載器

有使用Java類加載器設計的另一種方法並且沒有生成額外類別的作品。

Java有一個類加載器層次結構。每個類加載器都有一個父類加載器。類加載器層次結構的根是引導類加載器。當一個類用一個類加載器加載時,它會嘗試先用父類加載器加載類,然後再加載它本身。

您可以使用當前類加載器加載測試類。將它加載並用自己的類加載器加載它。唯一的區別是您將父類加載器設置爲無法加載測試類的加載器。

String resource = My.class.getName().replace(".", "/") + ".class"; 

//class loader of your test class 
ClassLoader myClassLoader = currentThread().getContextClassLoader(); 
assert ! toList(myClassLoader.getResources(resource)).isEmpty(); 

//just to be sure that the resource cannot be loaded from the parent classloader 
ClassLoader parentClassloader = getSystemClassLoader().getParent(); 
assert toList(parentClassloader.getResources(resource)).isEmpty(); 

//your class loader 
URLClassLoader myLoader = new URLClassLoader(new URL[0], parentClassloader); 
assert toList(myLoader.getResources(resource)).isEmpty(); 
+0

我提供了一個答案,但如果問題的限制可以放鬆,我更喜歡這個。 – SingleShot 2009-09-09 20:48:59

+0

如果您願意,您甚至可以使用擴展GZIPOutputStream類的JarOutputStream來創建一個jar。 – aperkins 2009-09-09 21:17:16

+0

有什麼不同?清單支持? – 2009-09-09 21:18:00

0

Maven的解決通過依賴分析構建順序,因此通常你的JAR文件將建立在訂單,因爲使用測試的JAR的人會簡單地把他們定義爲依賴關係。但是,依賴關係也放在了類路徑上。依賴關係的「範圍」決定了它繼續進行的類路徑。例如'編譯'依賴關係在類路徑上進行編譯,測試和運行; 「運行時」依賴關係位於類路徑上以進行測試和運行; '測試'依賴只在測試期間的類路徑上。不幸的是,你有一個沒有被任何可用範圍覆蓋的情況:你有一個依賴關係,但你不希望它在類路徑中。這是一個附帶使用案例,也是爲什麼你在發現示例時遇到困難的原因。因此,除非一些Maven專家指出相反的情況,否則我不建議在編寫特殊的Maven插件的情況下這是不可能的。不過,我推薦別的。你真的需要定製的JAR來測試你的類加載器嗎?這聽起來很腥。也許你可以使用任何舊的JAR?如果是這樣,我會使用maven-dependency-plugin將已知總是在你的版本庫中的一些JAR(例如log4j)複製到本地模塊的目標目錄中。然後您的測試可以通過文件路徑target/log4j-xxx.jar訪問該JAR,並且您可以執行此操作。

+0

我確實需要特殊的罐子。這些測試旨在顯示對我們正在實現的插件架構的特定模式的支持(對於像OSGi之類的東西來說太簡單了)。 「標準」罐子不適合這種模式,AFAIK。 – rtenhove 2009-09-09 22:14:21

相關問題