在junit测试期间模拟cdi拦截器

时间:2012-08-06 14:24:34

标签: junit mocking java-ee-6 cdi interceptor

我有一个复杂的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-,持久性和事务拦截器)。所以我想模仿这些拦截器实现。

有人知道怎么做吗?

4 个答案:

答案 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...

}