【问题标题】:WELD-SE + JUnit5 WELD-001409: Ambiguous dependencies for type Validator with qualifiers @DefaultWELD-SE + JUnit5 WELD-001409:带有限定符 @Default 的类型验证器的模棱两可的依赖关系
【发布时间】:2019-11-30 06:25:15
【问题描述】:

我想使用带有 JEE8 (CDI 2.0) 的 WELD SE 创建 REST 资源的单元测试。

这是REST资源的代码:

@Path("/members")
@RequestScoped
public class MemberResourceRESTService {
    @Inject
    private Logger log;

    @Inject
    private Validator validator;

    @Inject
    private MemberRepository repository;

    @Inject
    MemberRegistration registration;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Member> listAllMembers() {
        log.info("list all members");
        return repository.findAllOrderedByName();
    }

我创建了其余的测试junit

@ExtendWith(WeldJunit5Extension.class)
@EnableWeld
public class MemberTest {

    @WeldSetup
    public WeldInitiator weld = WeldInitiator.from(
            MemberResourceRESTService.class,
            Resources.class,
            WebResources.class,
            MemberRepository.class,
            MemberRegistration.class)
            .addBeans(createValidator(), createEntityManager())
            .activate(RequestScoped.class)
            .build();


    static Bean<?> createValidator() {
        return MockBean.builder()
                .types(Validator.class)
                .scope(ApplicationScoped.class)
                .creating(
//                        Validation.byProvider(HibernateValidator.class).configure().buildValidatorFactory().getValidator()
                        Validation.buildDefaultValidatorFactory().getValidator()
                ).build();
    }

    static Bean<?> createEntityManager() {
        return MockBean.builder()
                .types(Validator.class)
                .scope(ApplicationScoped.class)
                .creating(
                        Persistence.createEntityManagerFactory("primary-test").createEntityManager()
                ).build();
    }

    @Test
    @DisplayName("list all mambers test")
    public void list_all_members(MemberResourceRESTService memberResource) {

        final List<Member> members = memberResource.listAllMembers();
        Assertions.assertFalse(members.isEmpty());

    }

在 pom.xml 中,我在测试范围内添加了 hibernate-validator 引用,因此它首先可以创建验证器。

当我尝试运行测试时,我收到此错误:

org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type Validator with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private it.infocert.shop.rest.MemberResourceRESTService.validator
  at it.infocert.shop.rest.MemberResourceRESTService.validator(MemberResourceRESTService.java:0)
  Possible dependencies: 
  - org.jboss.weld.junit.MockBean@4893b344,
  - org.jboss.weld.junit.MockBean@249e0271

我该如何解决这个问题?

【问题讨论】:

    标签: java cdi java-ee-8 weld-se weld-junit5


    【解决方案1】:

    您的两种方法 - createEntityManager()createValidator() - 返回具有 .types(Validator.class) 的 bean。因此,您有两个符合条件的 bean 可以注入类型 Validator。我认为您将实体管理器输入为验证器是一个错误?

    附带说明,在同一个测试类中使用 @ExtendWith(WeldJunit5Extension.class)@EnableWeld 是多余的。 EnableWeld 只是 Junit 原始语法的缩写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多