我正在建立一个使用Weld SE和JUnit5进行测试的示例项目,由于某种原因,在我的测试类中,初始化焊接后,我观察到由于某种原因禁用了Bean发现,在这种情况下,最后,它导致我出现此错误:
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type Person with qualifiers @Default;
这是我的测试课:
@EnableWeld
public class SimpleTestA {
@Inject
Person p;
@Test
public void testThatItWorks() {
System.out.println("Hey");
}
}
位于:
projectName\core\model\src\test\java\com\aCompany\projectName\core\model\testmodel\SimpleTestA.java
这是我的beans.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" version="1.1" bean-discovery-mode="all" />
位于:
projectName\core\model\src\main\resources\META-INF\beans.xml
项目结构非常简单,我只有一个名为“ projectName”的主模块,它是名为“ core”的子模块的父级,其中包含我之前粘贴的所有内容。我的依赖项列表是这样的:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit-jupiter.aggregator.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>${weld.se.core.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.weld/weld-junit5 -->
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-junit5</artifactId>
<version>${weld.junit5.version}</version>
<scope>test</scope>
</dependency>
那是我的财产:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<weld.se.core.version>3.0.1.Final</weld.se.core.version>
<weld.junit5.version>1.3.1.Final</weld.junit5.version>
<junit-jupiter.aggregator.version>5.4.0</junit-jupiter.aggregator.version>
如果我通过显式的bean发现激活修改添加焊缝初始化属性的测试,则一切工作都很好:
@WeldSetup
WeldInitiator weldInitiator = WeldInitiator.of(WeldInitiator.createWeld().enableDiscovery());
我想念什么?如果存在beans.xml,是否不应该自动激活Bean发现?预先谢谢你。
答案 0 :(得分:1)
所以这里的事情是您使用的是Weld SE(嗯,weld-junit是),而不是您可能从WildFly这样的服务器上知道的Weld EE。
在SE中,默认情况下,发现处于关闭状态,因此使用了合成存档。 合成存档仅包含您自己提供的内容-诸如bean之类,要扫描的包等。它不扫描整个类路径。
因此,为了使您的示例生效,您可以启用发现功能,也可以通过Weld.addPackages()
,Weld.addClasses()
等添加所需的类和程序包。
在Weld-junit的上下文中,这转换为WeldInitiator.createWeld().addPackages()
。
Weld SE(和weld-junit)不执行整个发现的原因是因为您将有效地扫描整个类路径,包括JDK包和所有类。这需要时间,最重要的是,您还会发现大量不需要的咖啡豆。或者,您可以选择并非故意的拦截器/替代品。最后但并非最不重要的一点是,这些都是单元测试,因此需要最少的部署来测试您的bean。