我有一个复杂的Java EE 6应用程序,它包含一个Web模块,一个EJB模块和一些实用程序jar。
我想与Junit进行一些集成测试。因此我使用openwebbeans cdi容器(感谢Struberg先生http://struberg.wordpress.com/2012/03/17/controlling-cdi-containers-in-se-and-ee/) 它完美地运作。我可以在Junit测试中启动一个完整的cdi容器。
我的问题是我的应用程序中有一些拦截器无法在Junit测试中运行(MQ-,持久性和事务拦截器)。所以我想模仿这些拦截器实现。
有人知道怎么做吗?
答案 0 :(得分:0)
为什么不在Arquillian的容器中进行测试?想到的另一个选择是添加具有模拟功能的拦截器,并在启动CDI容器时排除实际的拦截器实现。
答案 1 :(得分:0)
您还可以使用嵌入式OpenEJB运行测试。
此链接http://openejb.apache.org/examples-trunk/interceptors/可能有用 - 也许设置'openejb.deployments.classpath.exclude'的属性可能有所帮助。
答案 2 :(得分:0)
可能涉及的人; - )
最后,我用干净的Java EE技术解决了我的问题。我提供了一个观察ProcessAnnotatedType事件的方法。此方法评估处理的类型,如果它是我的拦截器之一,则我否决处理。
public void processAnnotatedType(@Observes final ProcessAnnotatedType<?> event, final BeanManager manager) {
if (event.getAnnotatedType().getJavaClass().equals(PrivilegeCheckingInterceptor.class)) {
event.veto();
}
}
答案 3 :(得分:0)
“否决”的另一个选择可能是通过Deltaspike @Exclude注释。它可以根据ProjectStage否决bean。
示例:
@Exclude(ifProjectStage = ProjectStage.UnitTest.class)
public class MyInterceptor {
}
然后在测试中,您可以使用Deltapike test control module激活项目阶段,例如:
@RunWith(CdiTestRunner.class)
@TestControl(projectStage = UnitTest.class)
public class TestStageControl {
@Test...
}