BeanManager在上述用例中的单元测试期间不返回bean。该项目是一个Java库。
Bean接口
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";
}
}
以下单元测试在空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出了什么问题?
Thx
很可能您的bean在构建过程中被认为未使用并被删除。有关详细信息,请参阅https://quarkus.io/guides/cdi-reference#remove_unused_beans。
您可以尝试使用@Un已删除
来注释您的bean。
另请注意,BeanManager
不是应用程序代码使用的。这是一个集成SPI。此外,QUUKUS提供了更多集成第三方库和框架的惯用方法。