2016-04-25 7 views
0

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

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

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

Тем не менее, остается вопрос - почему не сжимается упаковка, когда я вызываю 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, то специалист распознаватель будет вероятно, выполняет эту работу. Там есть градильщик, но это не совсем то же самое. Моя лучшая попытка использовать его следующим образом

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

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

FYI Я использую термоусадочную версию 1.2.3, которая является последней.

Любая помощь будет высоко оценена.

+0

Что происходит, когда вы разархивируете свой? Я могу вспомнить аналогичную проблему, когда groovy-all.jar не был должным образом включен из-за отсутствия записей в каталоге. https://issues.apache.org/jira/browse/GROOVY-6158 –

ответ

1

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

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

    ... 

ПОМ файл генерируется с использованием Eclipse Plugin Gradle, как и так

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

, который установлен для запуска перед тестом интеграции ,

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