【问题标题】:CDI testing with Arquillian使用 Arquillian 进行 CDI 测试
【发布时间】:2015-09-20 09:04:40
【问题描述】:

3 天前,我完成了 Arquillian“入门”指南,并认为这对于我的 CQRS 系统部分进行单元测试是一件好事。

不幸的是,事实证明这有点不那么直截了当。在过去的 3 天里,我用谷歌搜索了任何对其他人有用的解决方案都没有解决的问题。

我得出的结论是,问题出在我的代码上,虽然我不知道是怎么回事。

我的任务是编写一个事件侦听器,用于侦听 ActiveMQ 主题的事件,然后更新 Mongo DB 中的“视图”。

系统中会有很多事件,所以对我来说创建一个所有事件侦听器都扩展的抽象基类似乎是合理的。

这个基类包含 Mongo 客户端并注册监听主题。它使用一个过载的 getter 作为侦听器名称,它用作骆驼路由中的 bean 引用。侦听器客户端 ID 由静态 long 生成,该静态 long 在每次侦听器注册时递增。这样可以确保每个听众都能看到发布到该主题的每个事件。意图是稍后添加一个过滤器以减少接收到的事件数量。

我已经构建了这段代码,并从生成事件主题帖子的计时器驱动它,一切正常。

问题在于要求 cobertura 通过单元测试报告 80% 的代码覆盖率。

我的测试应用程序不是单元测试,所以我的代码覆盖率为 0%。

我通过 CDI 中的其他几种单元测试方法来到 Arquillian,但如果我只能让它工作,Arquillian 似乎确实是最好的选择。

我得到的错误是:

java.lang.IllegalStateException: Could not find beans for Type=class org.apache.deltaspike.core.impl.scope.window.WindowBeanHolder and qualifiers:[]

我已经在 pom 中包含了 deltaspike,我已经将它添加到了 shrinkwrap 部署中

POM 提取物

<dependency>
    <groupId>org.apache.deltaspike.core</groupId>
    <artifactId>deltaspike-core-api</artifactId>
    <version>${deltaspike.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.deltaspike.core</groupId>
    <artifactId>deltaspike-core-impl</artifactId>
    <version>${deltaspike.version}</version>
</dependency>

<dependency>
    <groupId>org.jboss.shrinkwrap.resolver</groupId>
    <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
    <version>2.0.0</version>
</dependency>

测试类 @RunWith(Arquillian.class) 公共类 ListenerTest {

    AbstractEventListener listener = null ;
    WindowBeanHolder w = new WindowBeanHolder();

    @Deployment
    public static WebArchive createDeployment() {
        return ShrinkWrap.create(WebArchive.class).addAsLibraries(Maven.resolver().loadPomFromFile("pom.xml")
        .resolve("org.apache.deltaspike.core:deltaspike-core-api",
                 "org.apache.deltaspike.core:deltaspike-core-impl")
        .withoutTransitivity().asFile())
        .addAsWebInfResource("beans.xml");
}


    @Test
    public void testExecute() {
        Assert.assertNotNull(listener);
    }
}

我的 beams.xml

<?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>

如您所见,我什至尝试将 WindowBeanHolder 添加到代码中。

在过去的几天里,我对代码进行了许多更改。我没有包含完整的 pom 等,因为这可能不需要,但如果需要可以添加。

如果您对我可以从这里去哪里有任何建议,非常感谢。

【问题讨论】:

  • DeltaSpike 本身是通过 Arquillian 测试的。我会检查他们的设置。

标签: junit cdi jboss-arquillian


【解决方案1】:

通过接口抽象数据库层。为 prod 提供一个 mongo impl,但为测试提供一个可单元测试的有状态“dummy”impl。

让您的所有代码都引用接口并注入(必要时使用反射)虚拟 impl 以在运行单元测试之前测试您的代码。

【讨论】:

    【解决方案2】:

    只需要org.apache.deltaspike 包:

    return ShrinkWrap.create(WebArchive.class)
                .addClasses(HealthResource.class)
                .addPackages(true, "org.apache.deltaspike")
                .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
    

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2012-08-22
      • 1970-01-01
      • 2014-03-18
      • 2013-11-02
      • 1970-01-01
      相关资源
      最近更新 更多