java - 使用 JPA2 时如何对 EJB 进行单元测试?

标签 java unit-testing jakarta-ee jpa-2.0 ejb-3.1

您将如何对使用 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/

相关文章:

JAVA_HOME 未设置,并且在您的 PATH 中找不到 'java' 命令。位桶管道

java - JAVA从.txt文件读取特定数据

java - GlassFish 重新启动 - 现在收到异常,将上下文初始化事件发送到类的监听器实例

r - 如何在单元测试中重用示例?

jakarta-ee - 如何使用 JSF 2.0 和 EL 2.2 为 Tomcat 7 配置 Maven pom?

java - 需要根据 Servlet 响应有条件地设置 HTTP header

java - 为什么spring boot启动时会清除旧的日志配置

java - Eclipse插件: Link MulitPageEditorPart with Navigator

ruby - 如何从 Ruby 运行 Excel 宏?

java - 如何模拟 DriverManager.getConnection(...)?