WELD SE с JUnit 5 требует программного включения обнаружения компонентов

Я настраиваю пример проекта для целей тестирования, который использует 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», который является родителем подмодуля с именем «ядро», который содержит все, что я вставил ранее. Мой список зависимостей таков:

 <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>

and those are my properties :

  <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>

If I modify the test adding the weld initialization attribute with explicit bean discovery activation, everything works very well:

    @WeldSetup
WeldInitiator weldInitiator =     WeldInitiator.of(WeldInitiator.createWeld().enableDiscovery());

Что мне не хватает? Если файл beans.xml присутствует, не должно ли обнаружение компонентов активироваться автоматически? Заранее спасибо.


person Richard Temp    schedule 03.03.2019    source источник


Ответы (1)


Итак, дело в том, что вы используете Weld SE (ну, Weld-junit), а не Weld EE, который вы могли знать по таким серверам, как WildFly.

В SE обнаружение по умолчанию отключено и используется так называемый синтетический архив. Синтетический архив содержит только то, что вы сами ему загружаете - классы в виде bean-компонентов, пакеты для сканирования и т. д. Он не сканирует весь путь к классам.

Итак, чтобы ваш пример работал, вы можете либо включить обнаружение, либо добавить нужные классы и пакеты через Weld.addPackages(), Weld.addClasses() и так далее. В контексте Weld-junit это переводится как WeldInitiator.createWeld().addPackages().

Причина, по которой Weld SE (и сварка-junit) не выполняет полное обнаружение, заключается в том, что вы эффективно сканируете весь путь к классам, включая пакеты JDK и все такое. Это требует времени, и вдобавок ко всему вы также обнаруживаете тонны бобов, которые вам не нужны. Или вы можете подобрать перехватчики/альтернативы, которые вы не хотели. И последнее, но не менее важное: это должны быть модульные тесты, то есть минимальные развертывания, которые проверяют ваши bean-компоненты.

person Siliarus    schedule 04.03.2019
comment
Большое спасибо, что дали мне такой четкий ответ. - person Richard Temp; 16.03.2019