Arquillian在第一个测试类之后无法注入依赖项

stu*_*eep 4 java datasource jdbc jboss-arquillian postgresql-9.1

我有一个有点奇怪的问题.我目前正在使用Arquillian(1.1.0.Final)和Embedded GlassFish(3.1.2.2).我使用以下指南来设置我的小测试项目.使用集成的Derby数据库,一切正常.我的真实应用程序使用PostgreSQL作为数据库,因此我按如下方式配置了GlassFish资源:

    <!-- 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>
Run Code Online (Sandbox Code Playgroud)

我按照上面指南中的描述访问持久化上下文和用户事务:

@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 ...]
}
Run Code Online (Sandbox Code Playgroud)

如果我运行我的测试类(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 ... ]
}
Run Code Online (Sandbox Code Playgroud)

Maven(分别是surefire)给了我以下错误:

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 ... ]
Run Code Online (Sandbox Code Playgroud)

..具有以下根异常:

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
Run Code Online (Sandbox Code Playgroud)

我回到指南并试图用他们的代码重现我的问题 - 没有成功(即他们不受我的问题的影响).因此,我假设我的UserTransaction处理错误或者我的PostgreSQL配置存在问题.我尝试了不同的数据源,即

  • org.postgresql.ds.PGSimpleDataSource
  • org.postgresql.ds.PGPoolingDataSource

除了javax.xa.XADataSource一起org.postgresql.xa.PGXADataSource,但没有成功.

有人知道什么是错的吗?我不得不承认,我(非常)缺乏不同的数据源以及事务管理.


UPDATE

看起来这个问题与PostgreSQL无关,因为它也发生在MySQL(MariaDB)上.堆栈跟踪是一样的,所以我认为问题出在我的事务管理中.


亲切的问候,非常感谢您的帮助

stupidSheep

小智 8

这个错误是由ARQ-1071在1.0.4.Final中引入的,并且在当前版本(1.1.1.Final)中持续存在.原因是所有ThreadLocal出现都被InheritableThreadLocal取代,以在@Timeout用法上修复NPE.

建议的修复程序包括将一个InheritableThreadLocal恢复到ThreadLocal,就像它在以下Pull请求上完成一样:https: //github.com/arquillian/arquillian-core/pull/53

请就下一个1.1.2.Final版本发布的问题投票:https://issues.jboss.org/browse/ARQ-1458