您会如何去进行单元测试使用JPA的EJB?举例来说,如果我有一个Order实体,并与OrderEJB的是应该计算出总的订单(定义见下文),我将如何去单元测试EJB不接触数据库?此外,你会怎么定义值的实体,这样你就可以断言预期计算?这里低于...

一些示例代码
@Entity
public class Order {
    @Id
    private long OrderId;
    private LineItem[] items;
}

和一个OrderEJB的

@Stateless
public class OrderEJB {
    EntityManager em;
    public double calculateOrderTotal(long orderId) { .. }
}

您会如何单元测试calculateOrderTotal方法,如果我不能碰的数据库?我并不想实现一个DAO,因为我试图从该办法搬走。

感谢您的帮助。

有帮助吗?

解决方案

不是一般的理论,OrderEJB的,秩序和LineItem的是(如果我们忽视了注释)只是POJO,因此可以在独立的JUnit测试?我们将需要模拟的EntityManager,想必在

 calculateOrderTotal()

你有一些代码,在概念去

 em.giveMeThisOrder(orderId)

和你刚才嘲笑这一点。你正在测试然后businesss逻辑在由什么素回报驱动。这里的关键是,你必须使用一个很好的模拟框架,例如JMock的。在任何给定的测试你说(obviusly不与本语法):

 EntitiyManager mockEm = // create the mock
 mockEm.check(that you are called with and order Id of 73)
 mockEm.please( when someone calls giveMeThisOrder return then **this** particular order)

因此在创建正是为了每一个测试你需要锻炼你的calcualtion代码的某些方面。你可能有很多这样的测试,把你计算的所有边缘和角落的情况。

的关键思想这里单位测试意味着没有外部依赖诸如数据库。集成测试可以使用一个真正的数据库。它可以是一个麻烦,让您的嘲弄右侧,创建这些工作单实例可以说是相当平淡,但它往往使未来的测试快得多。

我也赞成这样做早期集成测试 - 你会发现一个整体的其他类的错误这样

其他提示

你给OpenEJB的一个尝试? - 如果您设置在嵌入式模式下,可以从日食差不多运行单元测试。我曾经嘲笑了实体管理器注射等,为之前的单元测试,但随后变得乏味。随着OpenEJB的,你可以用更少的设置做到这一点。 http://openejb.apache.org/

下面是我做的:

首先,你需要建立一个内存数据库用于测试。它的工作原理就像一个普通的数据库,但它不是存储在磁盘上。既德比和HSQLDB支持这一点。

在单元测试,手动创建一个EntityManager,并将它注入到你的EJB实例。您可能会需要保持到了EntityManager的引用,以便您可以管理的事务,这样的:

em.getTransaction().begin();
myEjb.doSomething(x, y);
em.getTransaction().commit();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top