7

我是一名 Web 开发人员,最终从事了一些 Java EE 开发(Richfaces、Seam 2、EJB 3.1、JPA)。为了测试 JPA,我使用了 hypersonic 和 Mockito。但我缺乏更深入的 EJB 知识。

有些人可能会争辩说我们应该使用 OpenEJB 和 Arquillian,但是为了什么?我什么时候需要进行容器相关测试?我需要 OpenEJB 和 Arquillian 的可能测试场景有哪些?

请赐教:)

4

2 回答 2

12

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

  1. 单元测试。这些旨在非常快(在几秒钟内执行整个测试套件)。他们测试非常小的代码块——即一种方法。要实现这种粒度,您需要使用 Mockito 模拟整个环境。您对以下内容不感兴趣:
    • 调用 EntityManager 并将实体放入数据库,
    • 测试交易,
    • 进行异步调用,
    • 击中 JMS 端点等。

您模拟整个环境并单独测试每个方法。单元测试是细粒度的并且非常快。这是因为您可以在每次对代码进行一些重要更改时执行它们。如果它们更复杂和更耗时,开发人员就不会像他应该的那样频繁地点击“测试”按钮。

  1. 集成测试。这些速度较慢,因为您想测试模块之间的集成。您想测试他们是否适当地相互“交谈”,即:
    • 交易是否以您期望的方式传播,
    • 如果您在没有任何事务的情况下调用您的业务方法会发生什么,
    • 从您的 WebServices 客户端发送的更改是否真的会影响您的端点方法并将数据添加到数据库中?
    • 如果我的 JMS 端点抛出 ApplicationException - 它会正确回滚所有更改吗?

如您所见,集成测试是粗粒度的,并且当它们在容器中执行时(或者基本上:在类似生产的环境中)它们要慢得多。每次代码更改后,开发人员通常不会执行这些测试。

当然,您可以在嵌入式模式下运行 EJB Container,就像在 Java SE 中执行 JPA 一样。关键是人工环境为您提供了基本服务,但您最终会对其进行调整,但最终的灵活性仍然低于真实容器中的灵活性。

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

希望能帮助到你。

于 2011-10-09T08:17:56.113 回答
0

我今年参加了 Devoxx,并有机会回答 JBOSS 伙计们这个问题。一些测试场景(我设法写下来的东西):

  • 容器的配置
  • 容器集成
  • 事务边界
  • 实体回调方法
  • 集成测试
  • 硒录音
于 2011-11-28T16:48:29.493 回答