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

junit测试期间的模拟cdi拦截器,junit,mocking,java-ee-6,cdi,interceptor,Junit,Mocking,Java Ee 6,Cdi,Interceptor,我有一个复杂的JavaEE6应用程序,其中包含一个web模块、一个EJB模块和一些实用程序JAR 我想用Junit做一些集成测试。因此,我使用openwebbeans cdi容器(感谢Struberg先生) 它工作得很好。我可以在Junit测试中启动一个完整的cdi容器 我的问题是,我的应用程序中有一些无法在Junit测试中运行的拦截器(MQ、持久性拦截器和事务拦截器)。所以我想模拟这些拦截器实现 有人知道怎么做吗?为什么不在Arquillian选择的容器中进行测试?想到的另一个选项是添加具有模

我有一个复杂的JavaEE6应用程序,其中包含一个web模块、一个EJB模块和一些实用程序JAR

我想用Junit做一些集成测试。因此,我使用openwebbeans cdi容器(感谢Struberg先生) 它工作得很好。我可以在Junit测试中启动一个完整的cdi容器

我的问题是,我的应用程序中有一些无法在Junit测试中运行的拦截器(MQ、持久性拦截器和事务拦截器)。所以我想模拟这些拦截器实现


有人知道怎么做吗?

为什么不在Arquillian选择的容器中进行测试?想到的另一个选项是添加具有模拟功能的拦截器,并在启动CDI容器时排除实际的拦截器实现。

为什么不在选择的容器中使用Arquillian进行测试?想到的另一个选项是添加具有模拟功能的拦截器,并在启动CDI容器时排除实际的拦截器实现。

您还可以使用嵌入式OpenEJB运行测试


此链接可能有用-设置“openejb.deployments.classpath.exclude”的属性可能会有所帮助。

您也可以使用嵌入式openejb运行测试

此链接可能有用-设置“openejb.deployments.classpath.exclude”的属性可能会有所帮助。

与之相关的人;-)

最后,我用干净的JavaEE技术解决了我的问题。我提供了一个观察ProcessAnnotatedType事件的方法。这个方法评估被处理的类型,如果它是我的一个拦截器,那么我否决处理

public void processAnnotatedType(@final processAnnotatedType事件,final BeanManager){
if(event.getAnnotatedType().getJavaClass().equals(PrivilegeCheckingInterceptor.class)){
事件否决权();
}       
}
与之相关的人;-)

最后,我用干净的JavaEE技术解决了我的问题。我提供了一个观察ProcessAnnotatedType事件的方法。这个方法评估被处理的类型,如果它是我的一个拦截器,那么我否决处理

public void processAnnotatedType(@final processAnnotatedType事件,final BeanManager){
if(event.getAnnotatedType().getJavaClass().equals(PrivilegeCheckingInterceptor.class)){
事件否决权();
}       
}
另一个“否决”选项是通过Deltaspike注释。它可以基于以下内容否决bean

例如:

@Exclude(ifProjectStage = ProjectStage.UnitTest.class)
public class MyInterceptor {
}
然后在测试中,您可以使用Deltapike激活项目阶段,例如:

@RunWith(CdiTestRunner.class)
@TestControl(projectStage = UnitTest.class)
public class TestStageControl {

@Test...

} 
“否决”的另一个选项是通过Deltaspike注释。它可以基于以下内容否决bean

例如:

@Exclude(ifProjectStage = ProjectStage.UnitTest.class)
public class MyInterceptor {
}
然后在测试中,您可以使用Deltapike激活项目阶段,例如:

@RunWith(CdiTestRunner.class)
@TestControl(projectStage = UnitTest.class)
public class TestStageControl {

@Test...

} 

是的,这正是我想要做的:排除原来的拦截器(在实用程序jar中)。但我不知道如何做到这一点。我还没有做到,但拦截器是另一种类型的Bean,您应该能够创建一个模拟拦截器,用@Alternative注释它,并在Bean.xmlYes中激活该替代项,这正是我想要做的:排除原始拦截器(在实用程序jar中)。但是我不知道怎么做,我还没有做过,但是拦截器是另一种Bean,你应该可以创建一个模拟的,用@Alternative注释它并在beans.xml中激活替换项。我想你可以用它在真实的容器中进行测试。我想你可以用它在真实的容器中进行测试。UnitTest是CDITestRunnittest的默认阶段,CDITestRunnittest是CDITestRunninter的默认阶段,更容易将Bean注入拦截器并提供扩展的带有@的版本专门用于测试类路径。DeltaSpike使用这种方法来定制拦截器。这个提示并不要求您使用DeltaSpike(您可以使用相同的方法)。将Bean注入拦截器并在测试类路径中使用@Specializes提供扩展版本更容易。DeltaSpike使用这种方法来定制拦截器。这个提示并不要求您使用DeltaSpike(您可以使用相同的方法)。