Как я могу внедрить для универсальных унаследованных типов?
Я потратил много времени, чтобы найти какие-либо ответы, но я думаю, что должен спросить.
Я использую 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)
1 ответ
Один из способов добиться этого — использовать программный поиск CDI . В вашем случае я бы начал с
@Inject Instance<Object>
а затем вы можете использовать последующие вызовы для
select()
а также
get()
методы, чтобы подобрать любой боб, который вы хотите. Использование выглядит примерно так (предполагается наличие bean-компонентов с типами
Foo
,
Bar
а также
List<String>
):
@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()
}