2012-08-06 61 views
0

我有一个复杂的Java EE 6应用程序,包含一个Web模块,一个EJB模块和一些实用程序罐。在junit测试期间模拟cdi拦截器

我想对Junit进行一些集成测试。因此我使用openwebbeans cdi容器(感谢Struberg先生http://struberg.wordpress.com/2012/03/17/controlling-cdi-containers-in-se-and-ee/) 它完美地工作。我可以在Junit测试中启动一个完整的cdi容器。

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

有谁知道如何做到这一点?

+0

我认为你可以使用http://arquillian.org/测试它在真正的容器中。 – Heidarzadeh 2012-08-08 12:13:41

回答

0

向谁可能关注;-)

在我解决我的问题,用干净的Java EE技术结束。我提供了一个观察ProcessAnnotatedType事件的方法。该方法评估处理的类型,如果它是我的拦截器之一,则我否决处理。

public void processAnnotatedType(@Observes final ProcessAnnotatedType<?> event, final BeanManager manager) { 
    if (event.getAnnotatedType().getJavaClass().equals(PrivilegeCheckingInterceptor.class)) { 
     event.veto(); 
    }  
} 
+0

将Bean注入拦截器并在测试类路径中使用@Specializes提供它的扩展版本。 DeltaSpike使用这种方法来允许自定义拦截器。这个提示并不要求你使用DeltaSpike(你可以使用相同的方法)。 – 2015-07-30 11:22:46

0

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

+0

是的,这正是我想要做的:排除原始拦截器(在实用程序jar中)。但我不知道我该如何做到这一点。 – 2012-08-07 06:29:56

+1

我还没有做到这一点,但拦截器是另一种类型的Bean,你应该可以创建一个模拟的,用@Alternative注释并激活beans.xml中的替代方法 – LightGuard 2012-08-07 19:13:37

0

“否决”的另一种选择可能是通过Deltaspike @Exclude注释。它可以根据ProjectStage否决豆类。

例子:

@Exclude(ifProjectStage = ProjectStage.UnitTest.class) 
public class MyInterceptor { 
} 

然后在您的测试,你可以激活使用Deltapike test control module,例如项目阶段:

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

@Test... 

} 
+0

UnitTest是带CdiTestRunner的默认Stage – 2015-07-30 11:18:20