1

我有一个复杂的 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

4 回答 4

1

敬启者 ;-)

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

public void processAnnotatedType(@Observes final ProcessAnnotatedType<?> event, final BeanManager manager) {
    if (event.getAnnotatedType().getJavaClass().equals(PrivilegeCheckingInterceptor.class)) {
        event.veto();
    }       
}
于 2012-11-26T07:34:28.500 回答
0

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

于 2012-08-06T18:09:36.210 回答
0

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

此链接http://openejb.apache.org/examples-trunk/interceptors/可能有用 - 也许设置“openejb.deployments.classpath.exclude”的属性可能会有所帮助。

于 2012-10-21T12:32:15.127 回答
0

“否决”的另一种选择可能是通过 Deltaspike @Exclude注释。它可以基于ProjectStage否决 bean 。

例子:

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

然后在您的测试中,您可以使用 Deltapike测试控制模块激活项目阶段,例如:

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

@Test...

} 
于 2015-07-28T17:49:00.170 回答