2014-12-20 2 views
0

Как создать тест Arquillian, который использует XStream?Как создать тест Arquillian, который использует XStream?

Как должен выглядеть метод развертывания?

Первое, что я пробовал, заключалось в добавлении моих классов и пакета 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"); 

ошибка Got жалуется на отсутствие зависимостей XStream, поэтому я добавил:

.addPackages(true, "org.dom4j") 
    .addPackages(true, "org.xmlpull") 

После этого, я все еще получаю следующее сообщение об ошибке:

com.thoughtworks.xstream.io.StreamException: Cannot create XmlPullParser at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:56) at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1040) at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1031) (...)

Что еще я могу сделать ?

ответ

3

Ответ на ваш вопрос в комментарии выше: 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.

Почему это так хорошо? Из-за двух причин:

  • в каждой библиотеке вы используете может иметь свои собственные транзитивные зависимости - так что вы должны добавить его отдельно (в вашем случае это: dom4j и xmlpull) - но может быть гораздо больше зависимостей.
  • библиотеки переупаковки чрезвычайно подвержен ошибкам, как вы уже заметили.

Разъемы ShrinkWrap - действительно полезная часть программного обеспечения.

+0

Это здорово! Благодаря! – pablosaraiva

+0

Рад, что это помогло :) –

2

Бывает, что XmlPullParserFactory xmlpull нуждается в специальном файле, который должен присутствовать в каталоге META-INF для работы.

Чтобы решить эту проблему, необходимо добавить следующую строку при создании веб-архив:

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

} 

Потребовалось некоторое время, чтобы выясните это. Надеюсь, это поможет кому-то.

+1

Рад, что вы решили свою проблему :) Но обратите внимание также, что при использовании 'XStream' в качестве библиотеки, добавленной в каталог WAR' lib/', ваша проблема никогда бы не существовала. –

+0

@GrzesiekD. Было бы здорово. Как я мог это сделать? Зависимость XStream добавляется к моему проекту с использованием maven, и война создается по методу развертывания. – pablosaraiva

+1

Этот ответ решил мою проблему, используя XStream в тестах с wildfly-arquillian-container-remote. – yamass

Смежные вопросы