如何在junit中为Jooq Select Query编写单元测试

Posted

技术标签:

【中文标题】如何在junit中为Jooq Select Query编写单元测试【英文标题】:How to write Unit testing for Jooq Select Query in junit 【发布时间】:2021-03-02 17:51:39 【问题描述】:
 public <Class> getClassbyName(String name) 
     private DSLContext context;
    
     return context.selectFrom(Table)
                   .where(Table.NAME.equal(name))
                   .fetchOneInto(Class.class);
 

我有这种功能。我需要在 JOOQ 中为这个 Select Query 编写一个单元测试。有人知道吗?

【问题讨论】:

你想测试什么?这个方法的调用者?还是查询的正确性? 我需要检查调用者和正确性。 【参考方案1】:

测试您的方法的客户端

如果您想测试该方法调用者的逻辑,您可以使用第三方库(如mockito)模拟该方法。这将允许您为一组已知的输入 String name 值生成一组预期的 Class 返回值。

您还可以对适用于整个应用程序的所有内容进行集成测试,如下所示。

您可以尝试模拟 jOOQ 本身 (and jOOQ offers such tooling),但我强烈建议不要这样做。迟早,您将实现整个 RDBMS。

测试查询的正确性

如果您想确保您的查询本身是正确的并且不会产生例如不需要的笛卡尔积或null 值等,您应该运行集成测试。

理想情况下,您的集成测试应尽可能接近您的生产环境。例如,如果您使用的是 PostgreSQL,那么您应该在具有已知数据集的实际 PostgreSQL 实例上运行此查询。运行此类测试的一个很好的实用程序是 testcontainers,但还有其他方法可以针对实际数据库实例进行自动化测试。

一种不太推荐的方法(但如果您的查询很简单,可能会更快,可能更方便)是在内存数据库上运行集成测试,例如H2。这个比较快,但是价格高:

您不能再使用生产数据库产品的供应商特定功能 您必须将数据库架构调整为生产数据库和测试数据库之间支持的最小公分母,例如数据类型等

但是,如果您的应用程序支持多个生产数据库产品,则此一个可行的选择,在这种情况下,上述两个警告无论如何都是您在生产中遇到的问题。

不过,我仍然会在大多数测试中使用测试容器。下面是一个使用测试容器设置代码生成的简单示例,例如:https://github.com/jOOQ/jOOQ/tree/main/jOOQ-examples/jOOQ-testcontainers-example

【讨论】:

以上是关于如何在junit中为Jooq Select Query编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章

将 UNNEST 与 jOOQ 一起使用

有没有办法在 JOOQ 中为具有相同表结构的多个模式设置代码生成?

给定一个 jooq 查询如何找到所涉及的表?

如何在Gradle中为单个测试类并行执行JUnit测试

JOOQ 在调用 select() 时创建高逗号

在 Servlet 和 JDBC 中为 JUnit 分离 H2 数据库 [关闭]