Как я могу ввести для универсальных унаследованных типов? - PullRequest
0 голосов
/ 02 октября 2018

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

Я использую 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)
...