gpt4 book ai didi

java - Arquillian 在第一个测试类之后无法注入(inject)依赖项

转载 作者:搜寻专家 更新时间:2023-11-01 01:22:01 24 4
gpt4 key购买 nike

我有一个有点奇怪的问题。我目前正在使用 Arquillian (1.1.0.Final) 和 Embedded GlassFish (3.1.2.2)。我使用了以下 guide设置我的小测试项目。集成的 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>

然后我按照上述指南访问持久性上下文和用户事务:

@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(分别是 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 ... ]

.. 有以下根异常:

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

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

  • org.postgresql.ds.PGSimpleDataSource
  • org.postgresql.ds.PPGoolingDataSource

以及 javax.xa.XADataSourceorg.postgresql.xa.PGXADataSource 都没有成功。

有人知道哪里出了问题吗?我不得不承认,我(非常)缺乏使用不同数据源和事务管理的经验。


更新

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


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

笨羊

最佳答案

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

提议的修复包括仅将 InheritableThreadLocal 的一次出现还原为 ThreadLocal,就像在以下 Pull Request 中所做的那样: https://github.com/arquillian/arquillian-core/pull/53

请对下一个 1.1.2 发布的问题进行投票。最终版本: https://issues.jboss.org/browse/ARQ-1458

关于java - Arquillian 在第一个测试类之后无法注入(inject)依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17806480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com