【发布时间】:2011-10-05 08:51:53
【问题描述】:
我在单元测试框架中有一个接口:CDIMocker。我目前正在使用拦截器来允许在 CDI 容器中进行模拟。这是一个实验——我正在考虑的几种单元测试方法之一。 (另一个主要竞争者是在 CDI 之外对所有 bean 和单元测试使用构造函数和方法注入 - 在这种情况下,这项工作更像是 CDI 扩展中的学习练习)。
我有两个自定义范围 - TestClassScoped 和 TestMethodScoped。我的 JUnit4 自定义运行器将适当的 Class 和 Method 块包装在根据需要启动和停止这些范围的语句中。如果需要,它还会启动 Weld-SE 的实例。它知道它是否在 CDI 中,因为扩展会记住。
无论我们在哪里使用,模拟程序界面都是相同的。在两个范围内公开它会很好,所以我可以
// Sadly Static Injection currently doesn't work, but if it did
@Inject @TestClassScoped
private static CdiMocker s_classScopedMocker
@Inject @TestMethodScoped
private CdiMocker m_methodScopedMocker
还有其他明显的方法。我目前在 CDI 外部的单例上有一个工厂方法,它可以返回这些实例中的任何一个(ThreadLocal),或者创建一个新的短期实例。我还成功地创建了两个具体的类并在它们上声明了不同的范围。
我尝试过使用上面注释的生产者方法,但没有运气。也许是一个简单的错误,也许是一个误解。
@Produces @TestClassScoped
public CdiMocker getClassScopedMockerForCdi()
{
return getTestClassContext().getMocker();
}
@Produces @TestMethodScoped
public CdiMocker getMethodScopedMockerForCdi()
{
return getTestMethodContext().getMocker();
}
我认为从 CDI 文档的某些部分可以像我所做的那样在注入点上声明作用域,但我注意到 Instance 接口不允许我使用作用域注释选择()所以也许是错了。
我可以提供两个限定词。一个注解可以同时是限定符和作用域吗?
另一个想法是让我的扩展提供两个 Bean
有什么最好的建议吗?
谢谢 - 理查德
(我很想将结果开源,但我已经在工作时间上做了足够多的工作,所以我不得不问,所以不太可能。商业论点将是公开审查。我现在使用拦截器,但它的缺点是留在原地,但想知道我是否可以通过拦截扩展中的 bean 生命周期来实现某些东西.我们可以将 Alternatives 用于与我们的遗留应用程序服务器通信的通信层之类的事情,但对于某些事情,单个单元测试需要一个自定义 mock 和 Alternatives 过于全球化。)
【问题讨论】:
标签: unit-testing jakarta-ee cdi