2016-04-25 9 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 
... 

、Mavenのリゾルバを考え、私はGradleのを使用していますが、私はMavenを使用していた場合おそらく仕事をする。グラデルリゾルバがありますが、それは全く同じことをしません。

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

これは、gradleタスクを開始し、結果のアーカイブにテストクラスを挿入します。問題は正しいwarファイルを作成するためにgradleを取得することでした。メインのソースセットではなく、統合テストのソースセットに属するリソースファイル(デプロイメント記述子など)を含めることを望みましたが、動作させることができませんでした。

FYI最新のshrinkwrapバージョン1.2.3を使用しています。

ご協力いただければ幸いです。

+0

解凍したらどうなりますか? groovy-all.jarがディレクトリエントリが見つからないために正しく組み込まれていないという同様の問題を思い出すことができます。 https://issues.apache.org/jira/browse/GROOVY-6158 –

答えて

1

次のように私は、Mavenのリゾルバを使用して、それを解決:

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") 
    } 
} 

のように、GradleののEclipseプラグインを使用して生成されます。

MavenリゾルバはPOMなしで使うことができますが、テストでアーティファクトを指定して、プロジェクトで使用しているものが最新であることを確認する必要があります。統合テストはすでに維持するのが難しいので、POMからの依存関係を解決して、正しいバージョンであることが分かります(心配することは少なくなります)。

関連する問題