Как я могу внедрить для универсальных унаследованных типов?

Я потратил много времени, чтобы найти какие-либо ответы, но я думаю, что должен спросить.

Я использую 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()
    }
Другие вопросы по тегам