2011-10-09 114 views
7

我是一个Web开发人员,最终在一些Java EE开发(Richfaces,Seam 2,EJB 3.1,JPA)中工作。要测试JPA,我使用超音速和Mockito。但是我缺乏更深入的EJB知识。在TDD中,为什么要使用OpenEJB以及为什么使用Arquillian?

有人可能会争辩说,我们应该使用OpenEJB和Arquillian,但为什么? 我什么时候需要做容器依赖性测试?我需要OpenEJB和Arquillian的可能测试场景是什么?

请赐教:)

回答

11

在这种情况下有两个方面。

  1. 单元测试。这些旨在非常快速(在几秒钟内执行整个测试套件)。他们测试你的代码的非常小的块 - 即一种方法。为了达到这种粒度,你需要使用Mockito来模拟整个环境。你不感兴趣:
    • 调用的EntityManager并把实体到数据库中,
    • 测试交易,
    • 使异步调用,
    • 击中JMS端点等

你嘲笑这整个环境,只是单独测试每种方法。 单元测试细化为,速度非常快。这是因为您可以在每次对代码进行重要更改时执行它们。如果它们更加复杂和耗时,开发者不会像他应该那样频繁地点击'测试'按钮。

  1. 积分测试。这些速度较慢,因为您要测试模块之间的集成。你想测试,如果他们适当地“讲”给对方,即:
    • 是你期望的方式传播的交易,
    • ,如果你没有交易调用你的业务方法都发生了什么,
    • 是否从您的WebServices客户端发送更改,确实遇到了您的端点方法,并将数据添加到数据库?
    • 如果我的JMS端点抛出ApplicationException - 它会正确回滚所有更改吗?

正如你看到的,集成测试是粗粒度和他们在容器正在执行(或基本上是:在生产环境中)他们要慢得多。这些测试通常不会在每次代码更改后由开发人员执行。

当然,您可以在嵌入模式下运行EJB容器,就像您可以在Java SE中执行JPA一样。重点在于人工环境为您提供了基本的服务,但您将以调整为结束,并且仍然以比实际容器更少的灵活性结束。

Arquillian使您能够在您选择的容器上创建生产环境,并在此环境中执行测试(使用数据源,JMS目标以及您期望在生产环境中看到的大量其他配置)。 )

希望它有帮助。

+0

谢谢,perf等答案。 JMS部分对我来说尤其有趣。 –

+0

很高兴我可以有任何帮助:-) –

+2

良好的写作。我很好奇“关键在于人为环境给你提供的基本服务,但你最终会调整它,并且仍然以比实际容器更少的灵活性结束”的意思是。 EJBContainer API背后的想法是,您正在使用真正的EJB容器。遵守或行为不应有任何差异。 –

0

今年我参加了Devoxx,并有机会回答JBOSS问题。 一些测试场景(我所管理的东西涂抹下):

  • 容器的配置
  • 集装箱集成
  • 事务边界
  • 实体回调方法
  • 集成测试
  • 硒录音
相关问题