我花了很多时间寻找答案,但我想我必须问一问。
我使用Weld-SE来测试我的实体。
我准备了实体随机化器进行测试。
abstract class BaseEntityRandomizer<T extends BaseEntity>
implements Randomizer<T> {
@Override public T getRandomValue() {
...
}
}
class MySomeOtherEntityRandomizer
extends BaseEntityRandomizer<MySomeOther> {
@Override public MySomeOther getRandomValue() {
...
}
}现在,使用我的测试类,我想注入那些每个都与泛型参数匹配的随机化器
@ExtendWith(WeldJunit5Extension.class)
@AddPackages({BaseEntityRandomizer.class})
abstract class BaseEntityTest<T extends BaseEntity> {
@Test void doSome() {
}
@Inject
private BaseEntityRandomizer<T> entityRandomizer;
}
class MySomeOtherTest extends BaseEntityTest<MySomeOther> {
...
// I expect an instance of MySomeOtherRandomizer in injected
// into the entityRandomizer field.
}准备了随机化器和测试的子类。
但我没能让它起作用。
我怎么才能让它工作呢?
我尝试了下面的工厂类
class BaseEntityRandomizerFactory {
@Produces
public BaseEntityRandomizer<MySome> produceMySomeRandomizer() {
return new MySomeRandomizer();
}
}我得到了
org.jboss.weld.exceptions.IllegalArgumentException:
WELD-001408: Unsatisfied dependencies for type BaseEntityRandomizer<T extends BaseEntity> with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject protected transient ....BaseEntityTest.entityRandomizer
at ....BaseEntityTest.entityRandomizer(BaseEntityTest.java:0)发布于 2021-09-06 07:43:01
实现这一点的一种方法是使用CDI Programmatic lookup。在您的示例中,我将从@Inject Instance<Object>开始,然后您可以使用对select()和get()方法的后续调用来获取您想要的任何bean。用法如下所示(假设存在类型为Foo、Bar和List<String>的bean):
@Inject
private Instance<Object> instance;
@Test void doSome() {
// selecting and obtaining instances of beans
Foo foo = entityRandomizer.select(Foo.class).get();
Bar bar = entityRandomizer.select(Bar.class).get();
// in case you need to select a parameterized type from instance, use TypeLiteral
List<String> listBean = entityRandomized..select( new TypeLiteral<List<String>>(){}).get()
}https://stackoverflow.com/questions/52600970
复制相似问题