У меня немного странная проблема. В настоящее время я использую Arquillian (1.1.0.Final) вместе с Embedded GlassFish (3.1.2.2). Я использовал следующий guide, чтобы настроить мой маленький тестовый проект. Все работало отлично с интегрированной базой данных Derby. Мое реальное приложение использует PostgreSQL в качестве базы данных, поэтому я настроил мои GlassFish ресурсы следующим образом:Arquillian не может вводить зависимости после первого тестового класса
<!-- See http://jdbc.postgresql.org/documentation/91/ds-cpds.html -->
<jdbc-connection-pool name="MyPostgresqlPool"
res-type="javax.sql.DataSource"
datasource-classname="org.postgresql.ds.PGSimpleDataSource"
is-isolation-level-guaranteed="false">
<property name="user" value="..." />
<property name="databaseName" value="..." />
<property name="password" value="..." />
<property name="serverName" value="..." />
<property name="portNumber" value="..." />
</jdbc-connection-pool>
И я достигаю контекст сохранения и транзакции пользователя, как описано в выше руководстве:
@RunWith(Arquillian.class)
public class AddressModuleTest extends BaseTest {
@PersistenceContext
protected EntityManager em;
@Inject
protected UserTransaction utx;
@Before
public void setUp() throws Exception {
utx.begin();
em.joinTransaction();
}
@After
public void tearDown() throws Exception {
utx.rollback();
}
[ ... snip ...]
}
Если Я запускаю свой тестовый класс (AddressModuleTest, обратите внимание, что «BaseTest» имеет статический метод, аннотированный с @Deployment для Arquillian), все в порядке, и я могу читать свои данные из базы данных PostgreSQL.
К сожалению, если я создаю второй класс тест не будет работать:
@RunWith(Arquillian.class)
public class CommunicationModuleTest extends BaseTest {
@PersistenceContext
protected EntityManager em;
@Inject
protected UserTransaction utx;
@Before
public void setUp() throws Exception {
utx.begin();
em.joinTransaction();
}
@After
public void tearDown() throws Exception {
utx.rollback();
}
[ ... snip ... ]
}
Maven (соответственно безошибочный) дает мне следующую ошибку:
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.758 sec <<< FAILURE!
loadMessageDAO(package.CommunicationModuleTest) Time elapsed: 0.027 sec <<< ERROR!
java.lang.RuntimeException: Could not inject members
at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:135)
at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.enrich(CDIInjectionEnricher.java:78)
at org.jboss.arquillian.test.impl.TestInstanceEnricher.enrich(TestInstanceEnricher.java:52)
at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ ... snip ... ]
.. со следующим корнем Исключение:
Caused by: org.jboss.weld.exceptions.IllegalArgumentException: WELD-001324 Argument bean must not be null
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:678)
at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:136)
at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:686)
at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:695)
at org.jboss.weld.manager.SimpleInjectionTarget$1.proceed(SimpleInjectionTarget.java:106)
at org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:134)
at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:46)
at org.jboss.weld.manager.SimpleInjectionTarget.inject(SimpleInjectionTarget.java:102)
at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectNonContextualInstance(CDIInjectionEnricher.java:145)
at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:125)
... 79 more
Я вернулся к руководству и попытался воспроизвести мою проблему с их кодом - wi й степени нет (т. они не затронуты моей проблемой). Поэтому я предполагаю, что обработка моего UserTransaction неверна или это проблема с моей конфигурацией PostgreSQL. Я пробовал разные источники данных, а именно
org.postgresql.ds.PGSimpleDataSource
org.postgresql.ds.PGPoolingDataSource
Как javax.xa.XADataSource
вместе с org.postgresql.xa.PGXADataSource
без успеха.
Есть ли у кого-нибудь понять, что случилось? Я должен признать, что я (очень) неопытен с другими DataSources, а также с управлением транзакциями.
UPDATE
Это выглядит так, как будто этот вопрос не зависит от PostgreSQL, как это происходит на MySQL (MariaDB), а также. StackTrace это то же самое, так что я предполагаю, что проблема лежит в моем Управление транзакциями ..
С наилучшими пожеланиями и большое спасибо за вашу помощь
stupidSheep
Hi postiveCoder! Спасибо за Ваш ответ! Я изменил свою версию на Arquillian 1.0.3.Final, и теперь она работает. Я попрошу в Аркиллианской общине (JBoss), если они могут помочь ... (см. Https://community.jboss.org/message/830718) и держите вас в курсе, если я знаю что-нибудь еще! – stupidSheep
Ни на SO, ни на форумах Arquillian кто-то не знал ответа, поэтому я соглашусь с вами, поскольку он обеспечивает обходной путь для моей проблемы :) – stupidSheep
Спасибо. Кажется, только у нас есть эта проблема. :) – briarheart