在上述用例中,BeanManager在单元测试期间不返回Bean。该项目是一个Java库。

Bean接口

public interface My {
  String turn();
}


Bean预选赛

@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";
    }
}


以下单元测试因空的bean列表而失败。

@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));
}


用于test1和test2的JUnit输出

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


在另一个Java库项目中运行相同的示例可以正常工作。

在单元测试类中添加注入的My属性也可以正常工作。

有什么问题吗?
在此示例中,BeanManager出了什么问题?

谢谢

最佳答案

您的bean很可能在构建期间被视为未使用并已删除。有关更多信息,请参见https://quarkus.io/guides/cdi-reference#remove_unused_beans

您可以尝试使用@Unremovable注释bean。

还要注意,BeanManager并不意味着由应用程序代码使用。这是一个集成SPI。此外,Quarkus提供了更多惯用的方式来集成第三方库和框架。

07-24 18:27