2013-02-05 6 views
5

Chcę utworzyć testy integracji za pomocą architektury arquillian. Jako wdrożenie chcę używać ucha używanego również do wdrażania w produkcji.Jak dodać klasy testowe do pliku importowanego ucha i uruchomić stronę serwera z arquillianem?

Więc to jest mój Wdrożenie:

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

gdy uruchamiam moją klasę testową dostaję java.lang.ClassNotFoundException ponieważ klasa test nie został znaleziony. Wiem, że mogę ustawić testable = false na wdrożenie, ale rozszerzenie trwałości nie działa: zobacz arquillian persistence extension doesn't work.

Jak mogę rozwiązać ten problem? Czy istnieje sposób dodania mojej klasy testowej do wdrożenia? A może powinienem utworzyć moje wdrożenie w inny sposób?

Odpowiedz

3

Można ręcznie dodać klasę testową do wojny wewnątrz ucha jak

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

Można użyć sposób określony przez Cheesus. Kiedy mam do czynienia z istniejącym EAR, wolę oddzielić WAR, która uruchamia testy, od rzeczywistych testów, które umieściłem w specjalnym JAR-ie wraz z innymi testowymi EJB. Moja wdrożenie wygląda następująco:

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

zauważy metody modyfikowania application.xml i jboss-deployment-structure.xml. Potrzebuję tych, aby zręcznie zainicjować JAR jako EjbModule wewnątrz EAR.

Przykład Jak mogę zmienić 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); 

}