当前位置: 首页 > 知识库问答 >
问题:

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

沃皓轩
2023-03-14

我有一个有点奇怪的问题。我目前正在使用Arquillian(1.1.0.final)和嵌入式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>

并且我访问持久性上下文和用户事务,如上面的指南所述:

@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”有一个静态方法,为Arquillian注释了@Deployment),一切都很好,我可以从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.xadatasourceorg.postgresql.xa.pgxadatasource都没有成功。

有人知道怎么了吗?我不得不承认我对不同的数据源和事务管理(非常)缺乏经验。

更新

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

对你的帮助表示亲切的问候和非常的感谢

笨羊

共有1个答案

南宫天逸
2023-03-14

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

建议的修复包括将InheritableThreadLocal仅一次还原为ThreadLocal,就像对以下拉请求所做的那样:https://github.com/arquillian/arquillian-core/Pull/53

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

 类似资料:
  • 我用TestNG类创建了一个Maven项目。在TestNG。xml我已经给出了套件的名称。我使用了多个浏览器Chrome和Firefox来并行运行。仅使用setup类和一个以上的类就可以了,但是当我使用注释包含多个类时,我会得到一个注入错误,并给出一个错误。 我将提供我尝试过的代码 设置。JAVA 我得到的错误如下: 无法使用[class org.openqa.selenium.remote.De

  • 我试图使用模板依赖注入来测试一个使用C系统调用在文件描述符上操作的C类。ideia是有一个抽象类和一个实例来包装系统调用,如read()、写()等。然后我用一个模拟来测试我的目标类。抽象类和系统调用看起来像:(为了清楚起见,我准备省略参数) 后来,我在课堂上注入奥斯卡,我想使用它: 现在,如果我想使用mock来测试我的FD类,我只需要在模板参数中传递mock,并使用GetOsCall获取mock实

  • 我试图使用Arquillian框架编写一个简单的Widlfly容器测试。我已经遵循了Wildfly容器测试指南中的指南。 得到的pom.xml如下所示。

  • 我试图不去增加很复杂的结构代码,保持简洁可测试性的代码和好的实践,我想我应该用Kotlin从其它方面去简化代码。如果你想了解一些控制反转或者依赖注入的话题,你可以查看我关于Android中使用Dagger注入的一系列文章。第一篇文章有关于他们这个团队的简单描写。 一种简单的方式,如果我们想拥有一些独立于其他类的类,这样更容易测试,并编写代码,易于扩展和维护,这时我们需要使用依赖注入。我们不去在类内

  • 我经常使用依赖于几个(比如5-10个)其他EJB/CDI bean的EJB,并且许多方法只使用它们的一个子集。集成测试(我们将Arquillian与嵌入式GlassFish4.0容器一起使用)它们是痛苦的,因为我仍然必须为整个类图提供依赖关系。我一个接一个地将类添加到ShrinkWrap归档中,因为添加整个包会创建更多的依赖关系,我不想添加所有类,因为这会显著增加完成一个测试所需的时间。我也不希望

  • 我已经尝试了几种方法来将依赖项注入我的实现中,但没有任何效果。我已经尝试了几乎所有的stackoverflow线程。我正在使用HiberNate Validator来实现自定义验证。我希望被注入