首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WELD SE与JUnit 5需要以编程方式启用bean发现

WELD SE与JUnit 5需要以编程方式启用bean发现
EN

Stack Overflow用户
提问于 2019-03-03 19:30:50
回答 1查看 2K关注 0票数 3

出于测试目的,我设置了一个使用Weld SE和JUnit5的示例项目,由于某种原因,在我的测试类中,在初始化weld I之后,观察到由于某种原因,它的bean发现被禁用,这最终导致了这个错误:

代码语言:javascript
复制
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type Person with qualifiers @Default;

这是我的测试类:

代码语言:javascript
复制
@EnableWeld
public class SimpleTestA {

@Inject
Person p;

@Test
public void testThatItWorks() {
    System.out.println("Hey");
 }
}

位于:

代码语言:javascript
复制
projectName\core\model\src\test\java\com\aCompany\projectName\core\model\testmodel\SimpleTestA.java

这是我的beans.xml:

代码语言:javascript
复制
<?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" />

位于:

代码语言:javascript
复制
projectName\core\model\src\main\resources\META-INF\beans.xml

项目结构相当简单,我只有一个名为"projectName“的主模块,它是名为”核心“的子模块的父模块,它包含了我之前粘贴的所有内容。我的依赖项列表如下:

代码语言:javascript
复制
 <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>

这些是我的属性:

代码语言:javascript
复制
  <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发现激活的焊接初始化属性的测试,一切都工作得很好:

代码语言:javascript
复制
    @WeldSetup
WeldInitiator weldInitiator =     WeldInitiator.of(WeldInitiator.createWeld().enableDiscovery());

我错过了什么?如果存在beans.xml,bean发现不应该自动激活吗?提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2019-03-04 23:12:03

所以这里的问题是,您使用的是Weld SE (好吧,weld-junit是),而不是您可能从WildFly等服务器上知道的Weld EE。

在SE中,默认情况下关闭发现,并使用所谓的合成归档。合成归档只包含你自己提供给它的任何东西--类作为bean,要扫描的包等等。它不会扫描整个类路径。

因此,要使您的示例工作,您可以启用发现功能,也可以通过Weld.addPackages()Weld.addClasses()等添加所需的类和包。在Weld-junit的上下文中,这转换为WeldInitiator.createWeld().addPackages()

Weld SE (和weld-junit)不执行整个发现的原因是,您将有效地扫描整个类路径,包括JDK包和所有包。这需要时间,最重要的是,你还会发现大量不需要的豆子。或者,您可以选择您不想要的拦截器/替代方案。最后但并非最不重要的一点是,这些是单元测试,所以测试bean的最小部署。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54968351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档