2013-02-05 4 views
5

Ich möchte Integrationstests mit Arquillian erstellen. Bei der Bereitstellung möchte ich das Ohr verwenden, das auch für die Bereitstellung in der Produktion verwendet wird.Wie man Testklassen zu einer importierten Ohrdatei hinzufügt und Server-Seite mit Arquillian laufen lässt?

Das ist also mein Einsatz:

@Deployment(testable = true) 
public static Archive<?> createDeployment() { 
    return ShrinkWrap 
      .create(ZipImporter.class, "test.ear") 
      .importFrom(new File("simple-webservice-ear-1.0.0-SNAPSHOT.ear")) 
      .as(EnterpriseArchive.class); 
} 

Wenn ich meine Testklasse laufen bekomme ich einen java.lang.ClassNotFoundException, weil die Testklasse nicht gefunden wird. Ich weiß, dass ich testable = false für die Bereitstellung festlegen kann, aber die Persistenz-Erweiterung funktioniert nicht: siehe arquillian persistence extension doesn't work.

Wie kann ich dieses Problem lösen? Gibt es eine Möglichkeit, meine Testklasse zur Bereitstellung hinzuzufügen? Oder sollte ich meine Bereitstellung auf andere Weise erstellen?

Antwort

3

Sie können manuell die Testklasse auf den Krieg im Ohr wie

WebArchive war = ear.getAsType(WebArchive.class, "/mywarname.war"); 
war.addClass(MyTestClass.class); 
2

fügen Sie den Weg durch Cheesus vorgesehen nutzen können. Wenn ich mit bestehenden EARs arbeite, ziehe ich es vor, den WAR, der die Tests ausführt, von den tatsächlichen Tests zu trennen, die ich zusammen mit anderen EJBs in spezielle JARs einspeise. Mein Einsatz sieht wie folgt aus:

@Deployment 
public static EnterpriseArchive createDeployment() { 

    String path = System.getProperty(EAR_PATH); 
    File f = new File(path); 
    EnterpriseArchive ear = ShrinkWrap.createFromZipFile(EnterpriseArchive.class, f); 

    final JavaArchive foobarEjb = ShrinkWrap.create(JavaArchive.class, "foobarEjb.jar"); 

    foobarEjb.addClasses(
        MyTest1.class, 
        MyTest2.class); 
    ear.addAsModule(foobarEjb); 


    final WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war") 
      .addAsWebInfResource("WEB-INF/web.xml") 
      .addAsWebResource("index.xhtml"); 

    ear.addAsModule(Testable.archiveToTest(war)); 

    modifyApplicationXML(ear); 
    modifyJBossDeploymentStructure(ear); 


    return ear; 
} 

Beachten Sie die Methoden, um die application.xml und jboss-deployment-structure.xml zu ändern. Ich brauche diese, um die JAR als EjbModule innerhalb der EAR zu initialisieren.

Beispiel wie kann ich application.xml ändern:

private static void modifyApplicationXML(EnterpriseArchive ear) { 
    Node node = ear.get("META-INF/application.xml"); 

    DescriptorImporter<ApplicationDescriptor> importer = Descriptors.importAs(ApplicationDescriptor.class, "test"); 
    ApplicationDescriptor desc = importer.fromStream(node.getAsset().openStream()); 

    String xml = desc.exportAsString(); 

    // remove lib definition 
    xml = xml.replaceAll("<library-directory>.*<\\/library-directory>", ""); 

    desc = (ApplicationDescriptor) importer.fromString(xml); 
    // append foobar test ejbs 
    desc.ejbModule("foobarEjb.jar"); 
    // append test war 
    desc.webModule("test.war", "/test"); 
    // append lib definition 
    desc.libraryDirectory("lib/"); 

    Asset asset = new StringAsset(desc.exportAsString()); 

    ear.delete(node.getPath()); 
    ear.setApplicationXML(asset); 

}