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类型参数的上限(如果有)
@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;