2016-04-25 9 views
0

Ich versuche, das Paket org.jibble.pircbot zu meinem Test-Archiv mithilfe von Shrinkwrap hinzuzufügen. Ich habe jede Variation ausprobiert, die mir einfällt, aber in allen Fällen ist das Paket nicht gefunden. Aus irgendeinem Grund können die Klassen jedoch einzeln hinzugefügt werden, aber anonyme innere Klassen werden nicht hinzugefügt.Schwierigkeit Hinzufügen von Paket zu Shrinkwrap-Archiv in Arquillian Test

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

Daraus ergibt sich die Ausnahme

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

Das ist seltsam, weil das Surfen im Code shrinkwrap Quelle ich eine Funktion gefunden, die die folgende Behauptung

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

Aber leider macht, scheint es, dass Tatsächlich rufen keine Testfälle diese Funktion auf.

Die Frage bleibt jedoch - warum nicht Shrinkwrap das Paket finden, wenn ich addPackages aufrufen (true, "org.jibble.pircbot")? Ich schaue auf das resultierende Archiv und es gibt kein Zeichen von org.jibble.pircbot, und natürlich gibt es die unvermeidlichen ClassDefNotFound Ausnahmen:

... 
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 
... 

ich gradle bin mit, aber wenn ich wurde mit Maven, die Maven-Resolver würde wahrscheinlich die Arbeit machen. Es gibt einen Gradel-Resolver, aber es macht nicht dasselbe. Mein bester Versuch es mit sich wie folgt

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

Dies tritt weg eine gradle Aufgabe und fügt die Testklassen in das resultierende Archiv. Die Herausforderung bestand darin, eine korrekte War-Datei zu erstellen. Ich wollte, dass es die Ressourcendateien (Deployment-Deskriptor usw.) enthält, die zum Integrationstest-Quellsatz gehören, nicht das Hauptquellset, aber ich konnte es einfach nicht zum Laufen bringen.

FYI Ich verwende Shrinkwrap Version 1.2.3, die die neueste ist.

Jede Hilfe würde sehr geschätzt werden.

+0

Was passiert, wenn Sie Ihre entpacken? Ich kann mich an ein ähnliches Problem erinnern, bei dem groovy-all.jar aufgrund fehlender Verzeichniseinträge nicht richtig eingebunden wurde. https://issues.apache.org/jira/browse/GROOVY-6158 –

Antwort

1

Ich löste es durch die Maven-Resolver wie folgt:

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

    ... 

Die POM-Datei erzeugt gradle Eclipse-Plugin, wie so

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

, die vor dem Integrationstest ausführen gesetzt .

Es stellt sich heraus, dass der Maven Resolver ohne POM verwendet werden kann, aber Sie müssen das Artefakt im Test angeben und sicherstellen, dass es immer aktuell ist mit dem, was Ihr Projekt verwendet. Integrationstests sind bereits mühsam zu warten, daher ist es besser, die Abhängigkeit vom POM zu lösen, damit Sie wissen, dass es die richtige Version ist (eine Sache weniger, um die Sie sich kümmern müssen).

Verwandte Themen