您将如何对使用 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 和 Order 和 LineItem 的一般理论(如果我们忽略注释)不是只是 POJO,因此可以在独立的 JUnit 中进行测试吗?我们需要模拟 EntityManager,大概在
calculateOrderTotal()
你有一些概念上的代码
em.giveMeThisOrder(orderId)
你只是 mock 这个。然后,您正在测试的业务逻辑将由 Mock 返回的内容驱动。这样做的关键是你必须使用一个好的模拟框架,例如 JMock。在你说的任何给定测试中(显然不是用这种语法):
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)
因此,在每个测试中,您都准确地创建了执行计算代码某些方面所需的顺序。您可能有很多这样的测试,它们插入了您计算的所有边缘和角落情况。
这里的关键思想是单元测试意味着没有外部依赖性,例如数据库。集成测试可以使用真实的数据库。正确设置模拟可能很麻烦,创建这些 Order 实例可能非常乏味,但它确实会使 future 的测试更快。
我也赞成进行早期集成测试 - 你会发现其他类型的错误。
关于java - 使用 JPA2 时如何对 EJB 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3834307/