Quarkus BeanManager с модульным тестом - PullRequest
0 голосов
/ 08 апреля 2020

BeanManager не возвращает bean-компоненты во время модульного тестирования в описанном выше сценарии использования. Проект представляет собой библиотеку Java.

Интерфейс компонента

public interface My {
  String turn();
}

Спецификатор компонента

@Qualifier
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface My1 {
}

Класс компонента

@ApplicationScoped
@My1
public class MyClass1 implements My {
    @Override
    public String turn() {
        return "1";
    }
}

Следующее модульный тест завершился неудачно с пустым списком компонентов.

@QuarkusTest
public class MyTest {

  @Test
  public void test1() throws IllegalAccessException, InstantiationException {
    Set<Bean<?>> beans = beanManager.getBeans(My.class, new AnnotationLiteral<My1>() {});
    MatcherAssert.assertThat(beans.isEmpty(), Is.is(false));
  }


  @Test
  public void test2() throws IllegalAccessException, InstantiationException {
    // Class<? extends Annotation>
    final Class<? extends Annotation> annotationClass = My1.class;
    final Annotation qualifier = new Annotation() {

        @Override
        public Class<? extends Annotation> annotationType() {
            return annotationClass;
        }
    };
    Set<Bean<?>> beans = beanManager.getBeans(My.class, qualifier);
    MatcherAssert.assertThat(beans.isEmpty(), Is.is(false));
}

Вывод JUnit для test1 и test2

java.lang.AssertionError: 
Expected: is <false>
     but: was <true>
Expected :is <false>
Actual   :<true>

Запуск того же примера в другом Java библиотечном проекте работает нормально.

Добавление вставленного атрибута My в класс модульного тестирования тоже работает нормально.

Что может быть не так? Что не так с BeanManager в этом примере?

Thx

1 Ответ

3 голосов
/ 09 апреля 2020

Весьма вероятно, что ваш бин считается неиспользованным и удаляется во время сборки. См. https://quarkus.io/guides/cdi-reference#remove_unused_beans для получения дополнительной информации.

Вы можете попытаться аннотировать ваш компонент с помощью @Unremovable.

Также обратите внимание, что BeanManager не предназначен для использования по коду приложения. Это интеграционный SPI. Кроме того, Quarkus предлагает больше идиоматических c способов интеграции сторонних библиотек и фреймворков.

...