Java 如何创建使用XStream的Arquillian测试?

Java 如何创建使用XStream的Arquillian测试?,java,xstream,jboss-arquillian,Java,Xstream,Jboss Arquillian,如何创建使用XStream的Arquillian测试 部署方法应该是什么样子 我尝试的第一件事是添加我的类和XStream包 ShrinkWrap.create(WebArchive.class, "myTest.war") .addClass(...) // my classes .addClass(...) // my classes .addPackages(true, "com.thoughtworks.xstream") .addAsResource("

如何创建使用XStream的Arquillian测试

部署方法应该是什么样子

我尝试的第一件事是添加我的类和XStream包

ShrinkWrap.create(WebArchive.class, "myTest.war")
    .addClass(...) // my classes
    .addClass(...) // my classes
    .addPackages(true, "com.thoughtworks.xstream")
    .addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml")
    .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
抱怨缺少XStream依赖项时出错,因此我添加了:

    .addPackages(true, "org.dom4j")
    .addPackages(true, "org.xmlpull")
在那之后,我仍然得到以下错误:

com.thoughtworks.xstream.io.StreamException:无法创建 XmlPullParser位于 com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:56) 位于com.thoughtworks.xstream.xstream.fromXML(xstream.java:1040) fromXML(xstream.java:1031)(…)


我还能做什么?

碰巧xmlpull的XmlPullParserFactory需要一个特殊的文件才能在META-INF目录下工作

要解决此问题,您需要在创建web存档时添加以下行:

.addAsResource("META-INF/services/org.xmlpull.v1.XmlPullParserFactory", "META-INF/services/org.xmlpull.v1.XmlPullParserFactory")
工作部署方法如下所示:

@Deployment
public static WebArchive createDeployment() {
    return ShrinkWrap.create(WebArchive.class, "myTest.war")
            .addClass(...) // my classes
            .addClass(...) // my classes
            .addPackages(true, "com.thoughtworks.xstream")
            .addPackages(true, "org.dom4j")
            .addPackages(true, "org.xmlpull")
            .addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml")
            .addAsResource("META-INF/services/org.xmlpull.v1.XmlPullParserFactory", "META-INF/services/org.xmlpull.v1.XmlPullParserFactory")
            .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");

}   

我花了一些时间才弄明白。我希望它能帮助一些人。

碰巧xmlpull的XmlPullParserFactory需要一个特殊的文件才能在META-INF目录下工作

要解决此问题,您需要在创建web存档时添加以下行:

.addAsResource("META-INF/services/org.xmlpull.v1.XmlPullParserFactory", "META-INF/services/org.xmlpull.v1.XmlPullParserFactory")
工作部署方法如下所示:

@Deployment
public static WebArchive createDeployment() {
    return ShrinkWrap.create(WebArchive.class, "myTest.war")
            .addClass(...) // my classes
            .addClass(...) // my classes
            .addPackages(true, "com.thoughtworks.xstream")
            .addPackages(true, "org.dom4j")
            .addPackages(true, "org.xmlpull")
            .addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml")
            .addAsResource("META-INF/services/org.xmlpull.v1.XmlPullParserFactory", "META-INF/services/org.xmlpull.v1.XmlPullParserFactory")
            .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");

}   

我花了一些时间才弄明白。我希望它能帮助别人。

在上面的评论中回答你的问题:可以是一条路

WebArchive archieve = ShrinkWrap
            .create(WebArchive.class, "myTest.war")
            .addPackages(true, "your.company.project")
            // other resources ...

File[] xstreamLib = Maven.resolver().resolve("com.thoughtworks.xstream:xstream:1.4.7")
            .withTransitivity().asFile();
archieve.addAsLibraries(xstreamLib);
其他示例用法

为什么这么好?原因有两个:

  • 您正在使用的每个库都可以有自己的可传递依赖项——因此您必须单独添加它(在您的示例中,这些库是:
    dom4j
    xmlpull
    )——但是可以有更多的依赖项
  • 重新打包库非常容易出错,您已经注意到了这一点

包覆膜式解析器是一款非常有用的软件。

在上面的评论中回答您的问题:可以这样做

WebArchive archieve = ShrinkWrap
            .create(WebArchive.class, "myTest.war")
            .addPackages(true, "your.company.project")
            // other resources ...

File[] xstreamLib = Maven.resolver().resolve("com.thoughtworks.xstream:xstream:1.4.7")
            .withTransitivity().asFile();
archieve.addAsLibraries(xstreamLib);
其他示例用法

为什么这么好?原因有两个:

  • 您正在使用的每个库都可以有自己的可传递依赖项——因此您必须单独添加它(在您的示例中,这些库是:
    dom4j
    xmlpull
    )——但是可以有更多的依赖项
  • 重新打包库非常容易出错,您已经注意到了这一点

包覆面提取解析程序是一款非常有用的软件。

很高兴您解决了您的问题:),但请注意,当使用WAR
lib/
目录下添加的
XStream
库时,您的问题将永远不会存在。@GrzesiekD。那太好了。我怎么能这么做?XStream依赖项是使用maven添加到我的项目中的,war是在部署方法中创建的。这个答案在使用wildfly-arquillian-container-remote的测试中使用XStream解决了我的问题。很高兴您解决了您的问题:),但也请注意,当使用
XStream
作为WAR
lib/
目录下添加的库时,您的问题将永远不会存在。@GrzesiekD。那太好了。我怎么能这么做?使用maven将XStream依赖添加到我的项目中,并在部署方法中创建war。这个答案解决了我在使用wildfly-arquillian-container-remote进行测试时使用XStream的问题。太棒了!谢谢太好了!谢谢