5

arquillianを使用して統合テストを作成したいと思います。デプロイメントとして、本番環境でのデプロイメントにも使用される耳を使用したいと思います。

これが私の展開です:

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

テストクラスを実行すると、テストクラスが見つからないため、java.lang.ClassNotFoundExceptionが発生します。デプロイメントでtestable=falseを設定できることはわかっていますが、永続性拡張機能が機能しません。arquillian永続性拡張機能が機能しないを参照してください。

どうすればこの問題を解決できますか?テストクラスをデプロイメントに追加する方法はありますか?または、別の方法でデプロイメントを作成する必要がありますか?

4

2 に答える 2

3

Cheesus が提供する方法を使用できます。既存の EAR を扱うときは、テストを実行する WAR を、他のテスト EJB と一緒に特別な JAR に入れた実際のテストから分離することを好みます。私の展開は次のようになります。

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

application.xmlおよびを変更するメソッドに注意してくださいjboss-deployment-structure.xml。JAR を EAR 内の EjbModule として適切に初期化するには、これらが必要です。

変更方法の例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);

}
于 2013-06-11T04:11:43.083 に答える
3

次のように、耳の内側の戦争にテストクラスを手動で追加できます

WebArchive war = ear.getAsType(WebArchive.class, "/mywarname.war");
war.addClass(MyTestClass.class);
于 2013-04-21T20:23:14.843 に答える