Unit testing CDI单元测试失败,限定符类型存在未满足的依赖项异常

Unit testing CDI单元测试失败,限定符类型存在未满足的依赖项异常,unit-testing,mockito,cdi,jboss-weld,cdi-unit,Unit Testing,Mockito,Cdi,Jboss Weld,Cdi Unit,嗨,我定义了以下限定符类型 @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.FIELD }) public @interface SortAndFilterType { /** * The value for the sort and filter. * * @return the sort and filter type value. */ String va

嗨,我定义了以下限定符类型

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.FIELD })
public @interface SortAndFilterType {

/**
 * The value for the sort and filter.
 *
 * @return the sort and filter type value.
 */
String value();
}
还有两个实现

@SortAndFilterType("Users")
public class UserSortAndFilterProviderImpl implements SortAndFilterProvider<Field, User>       {}

@SortAndFilterType("ReportsList")
public class ReportListSortAndFilterProviderImpl implements SortAndFilterProvider<Field, ReportList> {}
在运行时,每件事情都可以正常工作

但是当我运行单元测试时,问题就来了

我得到以下例外情况

org.jboss.weld.exceptions.DeploymentException:weld-001408:SortAndFilterProvider与限定符@SortAndFilterType的类型未满足依赖关系 在注入点[BackedAnnotatedField]@Inject@SortAndFilterType private com.collabnet.ctf.saturn.client.apps.users.ChangeUsersStatus.mSortAndFilterProvider

我从如下单元测试中调用它..它使用@RunWith(CdiRunner.class)运行

这里出了什么问题?

CDI的一个优点是它的类型安全解析考虑了参数化类型中的参数。换句话说:“CDI中没有类型擦除” 规范非常详细地介绍了参数化类型解析:

参数化bean类型被认为是可分配给参数化bean的 所需类型,如果它们具有相同的原始类型,并且对于每个参数:

  • 必需的类型参数和bean类型参数是具有相同原始类型的实际类型,如果该类型是参数化的,则 bean类型参数可分配给所需的类型参数 根据这些规则,或

  • 所需的类型参数是一个通配符,bean类型参数是一个实际类型,并且实际类型可分配给上层用户 通配符的下界(如果有)和可从下界(如果有)赋值 任何,通配符的,或

  • 所需的类型参数是通配符,bean类型参数是类型变量,类型变量的上限是 可转让给或可从上限(如有)转让给 通配符,可从通配符的下界(如有)赋值, 或

  • 所需的类型参数是实际类型,bean类型参数是类型变量,实际类型可分配给 类型变量的上限(如果有),或

  • 所需类型参数和bean类型参数都是类型变量,所需类型参数的上限为 可分配给bean类型参数的上限(如果有)

您可以在此处阅读原文:

现在,Weld 1.x对这一点要求不够严格,无法接受为其原始类型指定参数化类型。这可能就是为什么您在运行时(例如使用JBoss AS 7.x运行)没有问题,并且在测试中有这个问题(cdi runner可能使用Weld 2.x)。是的,我在这里猜测,我可能错了,这就是为什么给出您在问题中使用的框架版本总是一件好事

无论如何,您应该通过将注射点更改为来解决问题

@Inject
@SortAndFilterType("Users")
private SortAndFilterProvider<Field,?> mSortAndFilterProvider; 
@Inject
@SortAndFilterType(“用户”)
私人分拣机和过滤器提供程序MSORT和过滤器提供程序;
它遵守规范,可在焊缝1.x和2.x下工作

顺便说一下,您可能不需要限定符,因为以下两者之间不会有任何歧义:

@Inject
private SortAndFilterProvider<Field,User> mSortAndFilterProvider1;
@Inject
私人分拣机和过滤器提供程序MSORT和过滤器提供程序1;

@Inject
私人分拣机和过滤器提供程序MSORT和过滤器提供程序2;

嗨,这正是问题所在。我的运行时使用JBoss7,测试环境使用CDI2.x

在将类型参数添加到注入点后,它的工作非常好


非常感谢。

您能分享更多测试代码吗?您好,这正是问题所在。@user1882613,别忘了验证我的答案。或许您可以验证我的答案;)
@Inject
@SortAndFilterType("Users")
private SortAndFilterProvider<Field,?> mSortAndFilterProvider; 
@Inject
private SortAndFilterProvider<Field,User> mSortAndFilterProvider1;
@Inject
private SortAndFilterProvider<Field,ReportList> mSortAndFilterProvider2;