我有一个有点奇怪的问题。 我目前正在使用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 for 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.PGPoolingDataSource
以及javax.xa.XADataSource
和org.postgresql.xa.PGXADataSource
一起没有成功。
有人知道什么是错的吗?我必须承认,我(非常)缺乏不同的数据源以及事务管理。
更新
看起来这个问题与PostgreSQL无关,因为它也发生在MySQL(MariaDB)上。堆栈跟踪是相同的,所以我认为问题出在我的事务管理中..
亲切的问候,非常感谢你的帮助
stupidSheep
答案 0 :(得分:8)
这个错误是由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.Final版本上发布的问题投票: https://issues.jboss.org/browse/ARQ-1458
答案 1 :(得分:2)
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>
答案 2 :(得分:1)
我有类似的问题(唯一的区别是我收到消息“WELD-001456 Argument resolvedBean不能为null”)。已解析的bean存储在org.jboss.weld.manager.BeanManagerImpl类的实例中,该实例在微部署中的所有测试之间共享。在我的情况下,失败的原因是当一些测试完成时,它的线程与旧的TestRunnerAdaptor实例保持绑定,该实例链接到已经清理过的bean管理器(请参阅方法org.jboss.weld.manager.BeanManagerImpl.cleanup()) 。如果来自下一次微部署的某些测试将使用其中一个此类线程,则它将失败问题与Arquillian版本&gt;有关。 1.0.3.Final(在新版本中字段类型org.jboss.arquillian.junit.State.lastCreatedRunner从ThreadLocal更改为InheritableThreadLocal,现在方法org.jboss.arquillian.junit.State.isLastRunner()始终返回false)。< br />
我不知道如何解决这个问题。唯一的方法是使用Arquillian 1.0.3.Final。