Сложность добавления пакета в архив Shrinkwrap в тесте Arquillian

Я пытаюсь добавить пакет org.jibble.pircbot в мой тестовый архив с помощью shrinkwrap. Я перепробовал все варианты, которые только мог придумать, но во всех случаях пакет не был найден. Однако по какой-то причине классы могут быть добавлены индивидуально, но любые анонимные внутренние классы не добавляются.

  @Deployment
  public static WebArchive createDeployment() {
    return ShrinkWrap.create(WebArchive.class, "RcCustomerTest.war")
//      .addPackages(true, PircBot.class.getPackage())
//      .addPackages(true, "org.jibble.pircbot")
      .addClasses(PircBot.class,
        ReplyConstants.class,
        IrcException.class,
        NickAlreadyInUseException.class,
        InputThread.class,
        OutputThread.class,
        Queue.class)
      .addClass(DccManager.class) // Inner classes not added!
      .addPackages(true, "com.recursiveloop.webcommon")
      .addPackages(true, "com.recursiveloop.jloop.core.irc")
      .addAsResource("config.properties")
      .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
      .addAsWebInfResource("jboss-web.xml", "jboss-web.xml")
      .addAsWebInfResource("jboss-deployment-structure.xml", "jboss-deployment-structure.xml")
      .addAsResource("persistence.xml", "META-INF/persistence.xml")
      .setWebXML("web.xml");
  }

Это приводит к исключению

...
Caused by: java.lang.NoClassDefFoundError: org/jibble/pircbot/DccManager$1
        at org.jibble.pircbot.PircBot.<init>(PircBot.java:3081)
        ...

Это странно, потому что просматривая исходный код shrinkwrap, я нашел функцию, которая делает следующее утверждение

Assert.assertTrue("Adding a class should also add the anonymous inner classes",
    getArchive().contains(expectedPathAnonymousInnerClass));

Но, к сожалению, кажется, что ни один тестовый случай на самом деле не вызывает эту функцию.

Однако остается вопрос - почему shrinkwrap не находит пакет, когда я вызываю addPackages(true, "org.jibble.pircbot")? Я смотрю на полученный архив, и нет никаких признаков org.jibble.pircbot, и, очевидно, есть неизбежные исключения ClassDefNotFound:

...
Caused by: java.lang.NoClassDefFoundError: Failed to link com/recursiveloop/jloop/core/irc/VisitorConnection (Module "deployment.RcCustomerTest.war:main" from Service Module Loader): org/jibble/pircbot/PircBot
...

Я использую gradle, но если бы я использовал maven, то, вероятно, эту работу сделал бы распознаватель maven. Есть решатель Gradle, но он не совсем то же самое. Моя лучшая попытка использовать это было следующим

return ShrinkWrap.create(EmbeddedGradleImporter.class)
      .forProjectDirectory()
      .forTasks("integTestWar")
      .importBuildOutput("build/libs/integTest.war").as(WebArchive.class);

Это запускает задачу Gradle и вставляет тестовые классы в результирующий архив. Задача заключалась в том, чтобы получить верный военный файл. Я хотел, чтобы он содержал файлы ресурсов (дескриптор развертывания и т. Д.), Принадлежащие к исходному набору тестов интеграции, а не к основному набору исходных кодов, но я просто не мог заставить его работать.

К вашему сведению, я использую shrinkwrap версии 1.2.3, которая является последней.

Любая помощь приветствуется.

1 ответ

Решение

Я решил это с помощью распознавателя Maven следующим образом:

return ShrinkWrap.create(WebArchive.class, "RcCustomerTest.war")
  .addAsLibraries(Maven.resolver()
    .loadPomFromFile("build/pom.xml")
    .resolve("pircbot:pircbot")
    .withTransitivity().asFile())

    ...

Файл POM генерируется с помощью плагина eclipse от Gradle, вот так

task writeNewPom << {
  pom {
    writeTo("$buildDir/pom.xml")
  }
}

который настроен на запуск перед интеграционным тестом.

Оказывается, что распознаватель maven можно использовать без POM, но вам нужно будет указать артефакт в тесте и убедиться, что он остается в курсе того, что использует ваш проект. Интеграционные тесты уже трудны для поддержки, поэтому лучше разрешить зависимость от POM, чтобы вы знали, что это правильная версия (на одну вещь меньше беспокоиться).

Другие вопросы по тегам