使用Arquillian进行CDI测试

use*_*275 11 junit cdi jboss-arquillian

3天前,我完成了Arquillian"入门"指南,并认为这对我的CQRS系统的单元测试是一件好事.

不幸的是,事实证明这比直接前进要少.我用google搜索了过去3天的问题,这个问题没有得到任何适用于其他人的解决方案的解决.

我得出结论,问题是我的代码,虽然我没有看到如何.

我的任务是编写一个事件监听器,监听ActiveMQ主题的事件,然后更新Mongo DB中的"视图".

系统中会有很多事件,所以创建一个所有事件监听器都扩展的抽象基类似乎是合理的.

此基类包含Mongo客户端和寄存器以侦听主题.它使用过载的getter作为侦听器名称,它在camel路由中用作bean引用.侦听器客户机ID是从静态长度生成的,该静态长度在每次侦听器注册时递增.这可确保每个侦听器都能看到发布到主题的每个事件.意图是稍后添加过滤器以减少收到的事件数.

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

麻烦就是质量要求让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:[]
Run Code Online (Sandbox Code Playgroud)

我在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>
Run Code Online (Sandbox Code Playgroud)

测试类@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的beam.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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我甚至尝试将WindowBeanHolder添加到代码中.

我在过去几天对代码做了很多更改.我没有包括完整的pom等,因为这可能不需要,但可以根据需要添加.

如果您对我在哪里可以提出任何建议,请提前多多感谢.

Boh*_*ian 0

通过接口的方式抽象数据库层。为产品提供一个 mongo impl,但为测试提供一个可单元测试的有状态“虚拟”impl。

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