2013-02-05 16 views
5

Voglio creare test di integrazione usando arquillian. Come distribuzione voglio usare l'orecchio che è anche usato per distribuire in produzione.Come aggiungere classi di test a un file ear importato ed eseguire server side con arquillian?

Quindi questo è il mio schieramento:

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

Quando eseguo la mia classe di test ho un java.lang.ClassNotFoundException perché la classe di test non è stato trovato. So che posso impostare testable = false sulla distribuzione ma poi l'estensione di persistenza non funziona: vedi arquillian persistence extension doesn't work.

Come posso risolvere questo problema? C'è un modo per aggiungere la mia classe di test alla distribuzione? O dovrei creare il mio schieramento in un altro modo?

risposta

3

È possibile aggiungere manualmente la classe di test per la guerra dentro l'orecchio come

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

È possibile utilizzare il modo fornito da Cheesus. Quando ho a che fare con l'EAR esistente, preferisco separare il WAR che esegue i test, dai test effettivi che ho inserito in JAR speciali insieme ad altri EJB di test. La mia distribuzione si presenta così:

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

Avviso i metodi per modificare il application.xml e jboss-deployment-structure.xml. Ho bisogno di questi per inizializzare apertamente il JAR come EjbModule dentro l'EAR.

Esempio Come faccio a cambiare application.xml:

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); 

} 
Problemi correlati