Testing 集成测试期间焊缝的不满意依赖性
我能够部署一个RESTEasy应用程序,它可以很好地与Weld一起工作(这意味着我的CDI可以工作),但是我在集成测试中遇到了一些问题。我得到这个错误:Testing 集成测试期间焊缝的不满意依赖性,testing,integration-testing,cdi,weld,jboss-weld,Testing,Integration Testing,Cdi,Weld,Jboss Weld,我能够部署一个RESTEasy应用程序,它可以很好地与Weld一起工作(这意味着我的CDI可以工作),但是我在集成测试中遇到了一些问题。我得到这个错误: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type SomeService with qualifiers @Default 测试时: @RunWith(WeldJUnit4Runner.class) pub
org.jboss.weld.exceptions.DeploymentException:
WELD-001408: Unsatisfied dependencies for type SomeService with qualifiers @Default
测试时:
@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {
@Inject
private SomeService service;
@Test
public void test() {
System.out.println(service);
}
}
我日志中的最后一条消息是
DEBUG::WELD-000100: Weld initialized. Validating beans
src/test/resources/META-INF/beans.xml的内容:
<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"
version="1.1" bean-discovery-mode="all">
</beans>
我使用weld se
2.4.1.Final进行测试。谢谢 编辑:
因此,Weld似乎只查看src/test/java(当我将某个服务复制到src/test/java时,它就工作了)。这是愚蠢的,我不会复制我所有的类来测试它们。。。如何告诉Weld从src/main/java检索类?对不起,我没有解决方案,但只有一个小提示:如果您想对
BlockJUnit4ClassRunner
进行一些自定义,为什么不尝试扩展org.jglue.cdiunit.CdiRunner
或org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner
?或者至少看看他们的源代码
另外,我总是发现Weld的类路径扫描容易出错。并尽量避免它。它应该会起作用,所以我在这里发布了我所做的 首先,我使用:
- 月蚀
- jdk7
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>2.4.1.Final</version>
<scope>test</scope>
</dependency>
SomeServiceImpl
实现:
package org.jvi.cdirunner;
public class SomeServiceImpl implements SomeService {
@Override
public void test() {
// TODO Auto-generated method stub
}
}
以及要运行的测试:
package org.jvi.cdirunner.test;
import javax.inject.Inject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.jvi.cdirunner.SomeService;
@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {
@Inject
private SomeService service;
@Test
public void test() {
System.out.println(service);
}
}
如果我在Eclipse下运行测试,一切都会正常工作。我不明白为什么它在你这方面不起作用。所以我能够通过创建
src/main/resources/META-INF/beans.xml
来让它起作用,除了现有的src/main/webapp/WEB-INF/beans.xml
和src/test/resources/META-INF/beans.xml
意味着现在我在同一个项目中有3倍的文件我觉得这很傻,但我想这就是焊接世界的现状
谢谢大家抽出时间
编辑:实际上,我只能使用
src/main/resources/META-INF/beans.xml
(我删除了src/main/webapp/WEB-INF/beans.xml
)可能是您应该找到一种方法来注册SomeService
实现,就像Cdi单元对@AdditionnalClasses注释所做的那样。您确定在测试类路径上有SomeService
的实现吗?如果这在测试之外有效,而不是在这里,这意味着您的测试框架在CDI中运行得不好-例如,可能看不到bean。根据我自己的经验,我建议您尝试使用Arquillian测试CDI/Weld。@G.DemeckiCDI单元
找到它,并在我部署它时工作。除了我已经做过的让Weld发现beans的工作之外,还有什么可以做的呢?@Siliarus我真的需要让它能够扩展BlockJUnit4ClassRunner,因为我需要一些定制…我希望我可以避免Weld而使用Spring;-)感谢您花时间编写这样一个详细的答案:-)我用您的代码从头开始创建了一个新项目,它很有效,顺便说一句,我认为您的代码中有一个错误,位于import fr.pe.cdirunner.SomeService
而不是导入org.jvi.cdirunner.SomeService代码>法兰西?不管怎样,我想出来了,我会发布一个答案。谢谢。xml unter src/test/resources也为我解决了这个问题。我的SomeService位于不同的maven模块中,DeltaSpike似乎也需要每个引用模块中的所有配置。
package org.jvi.cdirunner;
public class SomeServiceImpl implements SomeService {
@Override
public void test() {
// TODO Auto-generated method stub
}
}
package org.jvi.cdirunner.test;
import javax.inject.Inject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.jvi.cdirunner.SomeService;
@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {
@Inject
private SomeService service;
@Test
public void test() {
System.out.println(service);
}
}