модульное тестирование EJB с Maven 2 и Glassfish 3 - PullRequest
11 голосов
/ 05 августа 2010

Я пытался настроить свое приложение так, чтобы я мог модульно тестировать его 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 сможет проиндексировать, чтобы дать мне артефакт, встроенный в стеклянную рыбу? В нескольких постах, которые я прочитал, упоминалось, что правильный артефакт, который сейчас используется, - это javax.ejb, но мне больше не повезло найти его.

Как вы, наверное, догадались, я совершенно новичок в модульном тестировании и довольно плохо знаком с JEE6 в целом; это даже правильный путь для модульного тестирования EJB?

1 Ответ

13 голосов
/ 05 августа 2010

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

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

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

Итак, есть ли хранилище Maven, которое Nexus сможет проиндексировать, чтобы дать мне артефакт, встроенный в стеклянную рыбу?

Я не смог воспроизвести проблему с 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), поэтому я бы не назвал это модульное тестирование. Но для интеграции / функционального тестирования (в контейнере) API EJBContainer действительно хорош и отлично подходит.

Смотри также

...