Какие классы моего приложения доступны в моих тестовых примерах Arquillian?

Я понимаю, что некоторые классы, которые не добавлены в мой архив shrinkWrap, используются во время выполнения тестовых случаев arquillian, что вызывает проблемы.

У меня есть функция загрузки в конфигурации моего приложения с такой подписью

public void boot(@Observes StartupEvent startupEvent, ExternalContext externalContext, Application application, ProjectStage deltaspikeProjectStage)

(startUpEvent отправляется, когда JSF готов, запущен и работает), и это не добавляет мою ShrinkWrap, но когда я запускаю тестовые примеры, они вызывают мою функцию загрузки. Этот ненужный звонок портит все. Когда я комментирую эту функцию, мои тестовые примеры работают нормально.

Я думал, что доступные классы для моих тестовых случаев должны быть добавлены в архив ShrinkWrap с такими командами, как

WebArchive webArchive=  ShrinkWrap
                    .create(WebArchive.class, "ROOT.war")
                    .addClasses(CdiTestBean.class,PersistenceListener.class)

но похоже я ошибаюсь. Что я должен сделать, чтобы сделать класс недоступным для архива shrinkWrap!!


person Yashar    schedule 13.06.2013    source источник
comment
Как выглядит ваш полный тест и веб-архив? Какой тип контейнера Arquillian вы используете? Есть ли исключение? Можете ли вы предоставить больше контекста?   -  person Hardy    schedule 14.06.2013
comment
позвольте мне еще раз объяснить проблему. В моем приложении у меня есть функция загрузки, которая прослушивает JSF с помощью наблюдателя (вы можете найти эту функцию в вопросе). когда я запускаю свой tomcat и загружаю приложение, эта функция будет вызываться. моя проблема в том, что когда я запускаю свои тестовые примеры arquillian, эта функция также вызывает (которую я не хочу вызывать). Я не добавлял класс с функцией загрузки в свой архив ShrinkWrap, так как тестовый пример arquillian находит и вызывает эту функцию загрузки !! Я использую Arquillian с CDI и Hibernate на embedded-tomcat7.   -  person Yashar    schedule 14.06.2013


Ответы (2)


Если вы используете встроенный контейнер, это может быть проблемой, так как все ваши компоненты CDI находятся в одном пути к классам. Поэтому они, вероятно, сканируются встроенной реализацией контейнера/cdi. Попробуйте использовать управляемую версию, если это возможно, это должно дать вам надлежащую изоляцию.

person bartosz.majsak    schedule 14.06.2013
comment
Я думал, что мой тестовый пример знает только о классах, которые были добавлены в мой архив ShrinkWrap, но, похоже, вы правы. Я создал два менеджера сущностей, один только для моего тестового примера, который я включил в свою архитектуру термоусадочной упаковки, а другой для всего приложения (я не включил его в свою термоусадочную пленку), и я получил неоднозначную зависимость с внедрением менеджера сущностей в моем тестовом примере, пока я не напишу квалификатор для своего менеджера тестовых сущностей - person Yashar; 15.06.2013
comment
Есть ли способ избежать подобных проблем в моем встроенном контейнере?! Я не хочу автоматического сканирования, я хочу работать только с теми классами, которые были добавлены в мой архив Shrinkwrap - person Yashar; 15.06.2013
comment
Не используйте встроенный контейнер :-) Почему бы не использовать удаленный? - person Hardy; 15.06.2013
comment
Спасибо. Он отлично работает с управляемым контейнером, но очень медленно. Интересно, сколько времени это займет, если мы хотим запустить около 300 тестовых случаев с каждым построенным Jenkins? - person Yashar; 17.06.2013

Перед возвратом webArchive добавьте эту строку:

new ZipExporterImpl(webArchive).exportTo(new File(System.getProperty("java.io.tmpdir"), "myWebArchive.war"), true);

он сохранит ваш веб-архив в файл во временной системной папке Java.

Извлеките войну, чтобы проверить наличие всех необходимых классов.

Вызов метода addClasses(Class... classes) должен добавить классы в войну.

person Boris Pavlović    schedule 13.06.2013
comment
У меня есть класс в моем приложении, который не включен в мой ShrinkWrap, и он мне не нужен в моем ShrinkWrap, но когда я запускаю свой тестовый пример, я вижу проблему в моей консоли, связанную с одной из функций этого класс (неудовлетворенные зависимости). Интересно, не включу ли я его в свой ShrinkWrap, почему мой тестовый пример может вызывать одну из своих функций? - person Yashar; 13.06.2013
comment
Вы должны увидеть, какой метод пытается вызвать метод отсутствующего класса из трассировки стека. - person Boris Pavlović; 13.06.2013