2016-04-25 24 views
0

我試圖使用shrinkwrap將包org.jibble.pircbot添加到我的測試存檔中。我試過了我能想到的所有變化,但在所有情況下都找不到包。但是,由於某些原因,這些類可以單獨添加,但不添加任何匿名內部類。在Arquillian測試中將包添加到Shrinkwrap存檔中很困難

@Deployment 
    public static WebArchive createDeployment() { 
    return ShrinkWrap.create(WebArchive.class, "RcCustomerTest.war") 
//  .addPackages(true, PircBot.class.getPackage()) 
//  .addPackages(true, "org.jibble.pircbot") 
     .addClasses(PircBot.class, 
     ReplyConstants.class, 
     IrcException.class, 
     NickAlreadyInUseException.class, 
     InputThread.class, 
     OutputThread.class, 
     Queue.class) 
     .addClass(DccManager.class) // Inner classes not added! 
     .addPackages(true, "com.recursiveloop.webcommon") 
     .addPackages(true, "com.recursiveloop.jloop.core.irc") 
     .addAsResource("config.properties") 
     .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") 
     .addAsWebInfResource("jboss-web.xml", "jboss-web.xml") 
     .addAsWebInfResource("jboss-deployment-structure.xml", "jboss-deployment-structure.xml") 
     .addAsResource("persistence.xml", "META-INF/persistence.xml") 
     .setWebXML("web.xml"); 
    } 

這導致異常

... 
Caused by: java.lang.NoClassDefFoundError: org/jibble/pircbot/DccManager$1 
     at org.jibble.pircbot.PircBot.<init>(PircBot.java:3081) 
     ... 

這很奇怪,因爲瀏覽拆封源代碼,我發現了一個功能,使以下斷言

Assert.assertTrue("Adding a class should also add the anonymous inner classes", 
    getArchive().contains(expectedPathAnonymousInnerClass)); 

但可悲的是,似乎沒有測試用例實際調用這個函數。

但是,問題仍然存在 - 當我調用addPackages(true,「org.jibble.pircbot」)時,爲什麼不能找到包?我看生成的存檔,有沒有org.jibble.pircbot的跡象,顯然有必然ClassDefNotFound例外:

... 
Caused by: java.lang.NoClassDefFoundError: Failed to link com/recursiveloop/jloop/core/irc/VisitorConnection (Module "deployment.RcCustomerTest.war:main" from Service Module Loader): org/jibble/pircbot/PircBot 
... 

我使用gradle這個,但如果我使用maven,maven的解析器會可能做這個工作。有一個gradle解析器,但它不完全相同。我使用它的最佳嘗試如下

return ShrinkWrap.create(EmbeddedGradleImporter.class) 
     .forProjectDirectory() 
     .forTasks("integTestWar") 
     .importBuildOutput("build/libs/integTest.war").as(WebArchive.class); 

這啓動了一個gradle任務並將測試類插入到生成的存檔中。面臨的挑戰是讓Gradle建立一個正確的戰爭檔案。我希望它包含屬於集成測試源集的資源文件(部署描述符等),而不是主源集,但我無法使其工作。

僅供參考我使用的是最新的1.2.3版本的shrinkwrap版本。

任何幫助將不勝感激。

+0

當你解壓你的時候會發生什麼?我可以回憶一下由於缺少目錄條目而導致groovy-all.jar沒有正確包含的類似問題。 https://issues.apache.org/jira/browse/GROOVY-6158 –

回答

1

我解決它通過使用maven的解析如下:使用gradle產出的Eclipse插件生成

return ShrinkWrap.create(WebArchive.class, "RcCustomerTest.war") 
    .addAsLibraries(Maven.resolver() 
    .loadPomFromFile("build/pom.xml") 
    .resolve("pircbot:pircbot") 
    .withTransitivity().asFile()) 

    ... 

的POM文件,像這樣

task writeNewPom << { 
    pom { 
    writeTo("$buildDir/pom.xml") 
    } 
} 

被設置在集成測試之前運行。

事實證明,Maven解析器可以在沒有POM的情況下使用,但是您必須在測試中指定工件並確保它始終與您的項目使用的最新信息一致。集成測試已經很難維護,所以最好從POM解析依賴關係,這樣你就知道它是正確的版本(不用擔心)。

相關問題