2013-07-23 2 views
2

У меня немного странная проблема. В настоящее время я использую 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

ответ

6

Эта ошибка была введена ARQ-1071 в версии 1.0.4.Final и сохраняется в текущей версии (1.1.1.Final). Причина в том, что все вхождения ThreadLocal были заменены InheritableThreadLocal, чтобы исправить NPE при использовании @Timeout.

Предлагаемое исправление состоит в REVERT только одного совпадения InheritableThreadLocal к ThreadLocal, как это было сделано на следующий Выдвижная запрос: https://github.com/arquillian/arquillian-core/pull/53

Пожалуйста, голосование по вопросу, который будет выпущен на следующей 1.1.2.Final версии : https://issues.jboss.org/browse/ARQ-1458

1

У меня аналогичная проблема (только разница заключается в том, что я получаю сообщение «WELD-001456 Аргумент разрешен. Бин не должен быть нулевым»). Решенные бобы хранятся в экземпляре класса org.jboss.weld.manager.BeanManagerImpl, который делится между всеми тестами в микроразвертывании.В моем случае причиной сбоя является то, что когда какой-либо тест завершен, его поток остается связанным со старым экземпляром TestRunnerAdaptor, который связан с уже очищенным менеджером bean-компонента (см. Метод org.jboss.weld.manager.BeanManagerImpl.cleanup()) , Если какой-либо тест из следующего микроразведки будет использовать один из таких потоков, это не сработает. Проблема связана с Arquillian с версией> 1.0.3.Final (в новых версиях тип поля org.jboss.arquillian.junit.State.lastCreatedRunner изменен с ThreadLocal на InheritableThreadLocal и теперь метод org.jboss.arquillian.junit.State. isLastRunner() всегда возвращает false).

Я не знаю, как решить эту проблему. Единственный способ - использовать Arquillian 1.0.3.Final.

+0

Hi postiveCoder! Спасибо за Ваш ответ! Я изменил свою версию на Arquillian 1.0.3.Final, и теперь она работает. Я попрошу в Аркиллианской общине (JBoss), если они могут помочь ... (см. Https://community.jboss.org/message/830718) и держите вас в курсе, если я знаю что-нибудь еще! – stupidSheep

+0

Ни на SO, ни на форумах Arquillian кто-то не знал ответа, поэтому я соглашусь с вами, поскольку он обеспечивает обходной путь для моей проблемы :) – stupidSheep

+0

Спасибо. Кажется, только у нас есть эта проблема. :) – briarheart

1

коммита, чтобы решить эту проблему в 1.0.3.Final была вернулась в последующих версиях, и не было до версии 1.1.4.Final, когда она была, наконец, решена.

<dependency> 
    <groupId>org.jboss.arquillian</groupId> 
    <artifactId>arquillian-bom</artifactId> 
    <version>1.1.4.Final</version> 
    <type>pom</type> 
    <scope>import</scope> 
</dependency> 
Смежные вопросы