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:[]
我在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) 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);
}
}
我的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>
正如您所看到的,我甚至尝试将WindowBeanHolder添加到代码中。
我在过去几天对代码做了很多更改。我没有包括完整的pom等,因为这可能不需要,但可以根据需要添加。
如果您有任何建议,我可以提前离开这里。非常感谢。
答案 0 :(得分:0)
通过接口抽象数据库层。为prod提供一个mongo impl,但是一个单元可测试的有状态&#34;虚拟&#34;用于测试。
让所有代码参考接口并在运行单元测试之前注入(如有必要,使用反射)虚拟impl来测试代码。
答案 1 :(得分:0)
仅需要org.apache.deltaspike
软件包:
return ShrinkWrap.create(WebArchive.class)
.addClasses(HealthResource.class)
.addPackages(true, "org.apache.deltaspike")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");