2015-07-02 97 views
9

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

不幸的是,这已证明有点不那么简单。我在过去3天内一直在搜索Google,并且这个问题没有通过任何为他人工作的解决方案解决。

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

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

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

此基类包含Mongo客户端并注册以侦听该主题。它使用一个超载的getter作为它在骆驼路由中用作bean引用的侦听器名称。侦听器客户端ID由静态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,我已经把它添加到拆封部署

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) public 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等,因为这可能不需要,但可以添加如果需要。

如果您有任何建议,我可以从这里前往很多谢谢。

+0

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

回答

0

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

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

相关问题