0

我花了很多时间寻找任何答案,但我想我必须问。

我正在使用 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)
4

1 回答 1

1

实现此目的的一种方法是使用CDI Programmatic 查找。在你的情况下,我会开始,@Inject Instance<Object>然后你可以使用随后的调用select()get()方法来选择你想要的任何 bean。用法看起来像这样(假设存在类型为Foo,Bar和的 bean 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()
    }
于 2021-09-06T07:43:00.750 回答