Модульные испытания EJB с Maven 2 и Glassfish 3
Я пытаюсь настроить приложение, чтобы я мог unit test его EJBs весь день, но, похоже, я не могу пройти мимо того, что кажется действительно простой проблемой.
У меня есть стандартное веб-приложение Maven, настроенное в NetBeans 6.9. Я автоматически генерировал unit test для одного из 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();
Стандартным рекомендуемым решением является добавление артефакта, встроенного в стеклянную фазу, в качестве первой зависимости проекта от области проверки
<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
(...) Стандартное рекомендуемое решение заключается в добавлении артефакта, встроенного в стеклянную фазу, в качестве первой зависимости проекта от области проверки
Действительно, вам нужна реализация типа 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
действительно отличен и отлично.
См. также