【问题标题】:How to create an Arquillian test that uses XStream?如何创建使用 XStream 的 Arquillian 测试?
【发布时间】:2014-12-20 21:10:54
【问题描述】:

如何创建使用 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) 在 com.thoughtworks.xstream.XStream.fromXML(XStream.java:1031) (...)

我还能做什么?

【问题讨论】:

    标签: java xstream jboss-arquillian


    【解决方案1】:

    在上面的评论中回答您的问题:ShrinkWrap resolvers 可能是要走的路。

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

    其他示例用法here

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

    • 您使用的每个库都可以有自己的传递依赖项 - 所以您必须单独添加它(在您的情况下,它们是:dom4jxmlpull) - 但可以有更多的依赖关系。
    • 重新打包库非常容易出错,正如您已经注意到的那样。

    ShrinkWrap 解析器是一款非常有用的软件。

    【讨论】:

    • 太棒了!谢谢!
    【解决方案2】:

    碰巧 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");
    
    }   
    

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

    【讨论】:

    • 很高兴您解决了您的问题 :) 但也请注意,当使用 XStream 作为在 WAR lib/ 目录下添加的库时 - 您的问题永远不会存在。
    • @GrzesiekD。那会很好。我怎么能那样做?使用maven将XStream依赖添加到我的项目中,并在部署方法处创建战争。
    • 这个答案解决了我在 Wildfly-arquillian-container-remote 测试中使用 XStream 的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2015-09-20
    • 2015-03-17
    • 1970-01-01
    • 2022-01-02
    • 2012-08-22
    相关资源
    最近更新 更多