【问题标题】:Injection doesn't work in Arquillian test注入在 Arquillian 测试中不起作用
【发布时间】:2018-04-28 19:27:39
【问题描述】:

我正在尝试使用 JavaEE 做简单的应用程序,目前我被 arquillian 测试困住了。我有一个这样的 BookRepository 类:

package com.pluralsight.bookstore.repository;

import javax.transaction.Transactional;
import static javax.transaction.Transactional.TxType.SUPPORTS;

@Transactional(SUPPORTS)
public class BookRepository {

}

和测试类 BookRepositoryTest :

package com.pluralsight.bookstore.repository;

@RunWith(Arquillian.class)
public class BookRepositoryTest {

    @Inject
    private BookRepository bookRepository;

    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class)
                .addClass(BookRepository.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")
                .addAsManifestResource("META-INF/test-persistence.xml", "persistence.xml");
    }

    @Test
    public void create() {
        assertNotNull(bookRepository);
    }
}

运行测试结果:

    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 9.864 sec <<< FAILURE!
    create(com.pluralsight.bookstore.repository.BookRepositoryTest)  Time elapsed: 0.287 sec  <<< ERROR!
    java.lang.NullPointerException
            at com.pluralsight.bookstore.repository.BookRepositoryTest.create(BookRepositoryTest.java:38)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            ...

没有任何解释。当我检查 assertNotNull 时, bookRepository 始终为空,所以我猜注入在这里不起作用。项目结构如下所示:

我尝试寻找答案已有一段时间了,但我仍然在同一个地方。对于容器,我使用 Wildfly 远程运行测试,并在后台运行 WildFly。 提前感谢您的帮助!

【问题讨论】:

  • 是 bookRepository 属性/变量被设置还是为空?
  • @JeffreyPhillipsFreeman 我认为它正在通过注入进行初始化。我正在学习关于复数视觉的课程,这一切都通过了。但是这门课程并不新鲜,也许从那以后发生了一些变化。那么它应该在测试中的某个地方初始化吗?除了书籍模型和语言枚举之外,我粘贴的代码是我现在唯一拥有的代码。
  • @Animu 假设您在某处的配置中没有出错,注入注解可能会为您初始化它。为什么不手动检查它的值是否为 null 以确保我们可以排除这种可能性。
  • 啊,在这种情况下,似乎 你的问题。问题是注入不起作用并且 bookRepository 为空。所以这真的缩小了如何解决这个问题。
  • @MaxVollmer 更改为最少的代码。再次感谢您的通知:)

标签: java integration-testing jboss-arquillian


【解决方案1】:

好吧,我终于成功了。显然我使用了错误的“@Inject”注释。我使用的是 arquillian 一,而不是 javax 一。我变了

import org.jboss.arquillian.core.api.annotation.Inject;

在我的测试用例类中

import javax.inject.Inject;

它就像一个魅力。追踪起来真的很烦人,实际上我是靠运气找到的,所以我希望这对将来的人有所帮助。

【讨论】:

  • 我遵循相同的教程并被困在完全相同的地方。你是救生员。如果其他人在关注本教程,作者使用了大量的 intellij 生成,所以如果你是新手,连接点有点困难。
【解决方案2】:

Wildfly 是一个符合 Java EE 7 的 AS,默认情况下在 JavaEE 7 CDI bean 中发现如果注释,请查看 Default CDI Enablement in Java EE 7,这可能是您的情况,您有一个空 beans.xml。 所以要注入BookRepository,你必须添加一个范围注释(参见CDI scopes),例如@ApplicationScoped

@ApplicationScoped
@Transactional(SUPPORTS)
public class BookRepository {

}

或者你必须包含一个beans.xml,发现模式all,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
       http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="all">
</beans>

将它放在 src/test/resources 下以将其包含在您的测试中,修改如下:

package com.pluralsight.bookstore.repository; 

@RunWith(Arquillian.class) 
public class BookRepositoryTest { 

    @Inject 
    private BookRepository bookRepository; 

    @Deployment 
    public static JavaArchive createDeployment() { 
         return ShrinkWrap.create(JavaArchive.class) 
                                         .addClass(BookRepository.class) 
                                         .addAsManifestResource("META-INF/beans.xml", "beans.xml")
                                         .addAsManifestResource("META-INF/test-persistence.xml", "persistence.xml"); 
     } 

    //...

}

【讨论】:

  • 我试图将@ApplicationScoped 添加到类中,但它告诉我“'@ApplicationScoped' 不适用于类型”。还尝试在 bookstore-back\src\main\resources\META-INF\beans.xml 中添加 beans.xml,但它突出显示“beans”为不可解析。
  • 我编辑了 beans.xml 的答案。 @ApplicationScoped 是 this 吗?
  • 我添加了您在 test/resources/META-INF/beans.xml 中发布的 beans.xml,但它仍然无法正常工作。关于“@ApplicationScoped”,我不知道我是否理解正确,但我有“import org.jboss.arquillian.core.api.annotation.ApplicationScoped;”。尝试导入您发布的但在 javax.enterprise 后无法解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2012-06-26
  • 2017-05-28
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2015-03-10
相关资源
最近更新 更多