модульное тестирование EJB с Maven 2 и Glassfish 3

Я пытался настроить свое приложение так, чтобы я мог выполнять модульное тестирование его EJB-компонентов весь день, но, похоже, я не могу решить эту действительно простую проблему.

У меня есть стандартное веб-приложение Maven, настроенное в NetBeans 6.9. Я автоматически сгенерировал модульный тест для одного из EJB-компонентов, но всякий раз, когда я запускаю его, я получаю сообщение об ошибке:

Testcase: initializationError(com.example.ExampleTest): Caused an ERROR
Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer
java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)

Я исследовал это до смерти, и я почти уверен, что проблема в том, что мой pom в настоящее время указывает на банку, которая содержит только API

<dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>

Не а реализация, которую можно использовать для запуска тестов. Я почти уверен, что тест не работает в методе, отмеченном @BeforeClass, когда он пытается выполнить

container = EJBContainer.createEJBContainer();

Стандартное рекомендуемое решение - добавить артефакт glassfish-embedded-all в качестве первой зависимости проекта с областью тестирования.

<dependency>
            <groupId>org.glassfish.extras</groupId>
            <artifactId>glassfish-embedded-all</artifactId>
            <version>3.0.1</version>
            <scope>test</scope>
        </dependency>

Я могу найти пакет Maven для этого артефакта здесь: http://download.java.net/maven/glassfish/, но Nexus не распознает этот каталог или какие-либо подкаталоги как репозитории Maven 2. Полагаю, я мог бы загрузить банку и вручную установить ее в Nexus, но это, похоже, опровергает точку зрения ВОЗ по установке Nexus.

Итак, есть ли репозиторий Maven, который Nexus сможет проиндексировать, чтобы получить артефакт glassfish-embedded-all? В нескольких сообщениях, которые я прочитал, упоминалось, что правильный артефакт, который сейчас нужно использовать, - это javax.ejb, но мне больше не удалось его найти.

Как вы, наверное, догадались, я новичок в модульном тестировании и довольно новичок в JEE6 в целом; Это вообще правильный способ модульного тестирования EJB-компонентов?


person wobblycogs    schedule 05.08.2010    source источник


Ответы (1)


(...) Стандартное рекомендуемое решение - добавить артефакт glassfish-embedded-all в качестве первой зависимости проекта с областью тестирования.

В самом деле, вам нужна такая реализация, как glassfish-embedded-all или glassfish-embedded-web, если вы используете только веб-профиль, что, похоже, ваш случай (кстати, я не знал, что веб-профиль предоставлял EJBContainer).

И если быть точным, этот артефакт не обязательно должен быть «первой» зависимостью, но он должен быть объявлен перед артефактом javaee-api.

Итак, есть ли репозиторий Maven, который Nexus сможет проиндексировать, чтобы получить артефакт glassfish-embedded-all?

Мне не удалось воспроизвести проблему с помощью http://download.java.net/maven/glassfish/, но похоже, что в репозитории JBoss Nexus он есть (вероятно, потому, что они используют его в Arquillian):

<repository>
  <id>jboss-public-repository-group</id>
  <name>JBoss Public Maven Repository Group</name>
  <url>https://repository.jboss.org/nexus/content/groups/public</url>
</repository>

Это вообще правильный способ модульного тестирования EJB-компонентов?

Модульные тесты обычно выполняются вне контейнера и изолированно (с использованием Mocking framework), поэтому я бы не стал называть это модульным тестированием. Но для интеграционного / функционального тестирования (в контейнере) EJBContainer API действительно хорош и прекрасно.

Смотрите также

person Pascal Thivent    schedule 05.08.2010
comment
Спасибо Паскаль, отличный ответ, как всегда. К сожалению, это не решило мою проблему. Я думаю, что я неправильно настраиваю Nexus или что-то в этом роде. Я пробовал настроить предложенный вами репозиторий и этот repository.jboss.org/ nexus / content / repositories / glassfish, и ни один из них никогда не показывает ничего для загрузки на вкладке индекса просмотра (если вы знакомы с Nexus). У меня есть 4 или 5 других репозиториев maven, настроенных под Nexus, поэтому я не могу понять, почему они вызывают столько проблем. Я даже пробовал установить полностью чистую установку Nexus - все равно безуспешно. - person wobblycogs; 06.08.2010
comment
@wobblycogs Что касается download.java.net/maven/glassfish, обратите внимание, что этот репозиторий не t предоставить индекс Nexus (каталог .index в корне), поэтому я не ожидал увидеть что-либо на вкладке индекса просмотра, если Nexus не загрузил из него артефакт. Однако repository.jboss.org/nexus/content/groups/public определенно делает. Но вы разрешили загрузку индекса из удаленного репозитория? См. sonatype.com/books/nexus-book/reference /. В любом случае, действительно работает функция прокси или нет (удается ли вашему клиенту maven загружать артефакты)? - person Pascal Thivent; 06.08.2010
comment
@pascal Да, загрузка индексов разрешена, в журналах Nexus я получаю: Прерванный переход по ID репозитория = 'jboss-glassfish' from path = '/. index', причина: Элемент не найден по пути /.index в репозитории jboss- стеклянная рыба!. Нет, похоже, я не могу загрузить какие-либо артефакты из этого репозитория. Я попытался добавить репозиторий в свой файл settings.xml, но это не помогло. Я просто получил: Невозможно найти ресурс org.glassfish.extras: glassfish-embedded-all: jar: 3.0.1 'в репозитории jboss-glassfish ( repository.jboss.org/nexus/content/repositories/glassfish) - странно, поскольку этот URL-адрес правильный. - person wobblycogs; 06.08.2010
comment
@wobblycogs Что ж, боюсь, я больше не смогу помочь, так как не могу воспроизвести проблему. Я только что попробовал (с обоими repository.jboss.org/nexus/content/repositories/glassfish и repository.jboss.org/nexus/content/groups/public) и у меня это работает. - person Pascal Thivent; 06.08.2010
comment
Для всех, кто читает этот вопрос, я рад сообщить, что я решил эту проблему и действительно провел несколько тестов. Основная проблема заключалась в том, что Nexus отказывался искать артефакт, содержащий все в стеклянной рыбке. Просто повозившись с ним, мне удалось заставить его загрузить его, но он сломал ряд других репозиториев, которые я не трогал. В конце концов я сдался и заново настроил Nexus с нуля. Все артефакты сейчас скачиваются нормально, могу только предположить, что репозиторий Nexus каким-то образом испортился. - person wobblycogs; 06.08.2010
comment
Огромное спасибо. Много искал, пока не нашел твою! - person Sara; 12.07.2012