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

How to write Unit testing for Jooq Select Query in junit

 public <Class> getClassbyName(String name) {
     private DSLContext context;
    
     return context.selectFrom(Table)
                   .where(Table.NAME.equal(name))
                   .fetchOneInto(Class.class);
} 

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

测试客户的方法

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

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

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

测试查询的正确性

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

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

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

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

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

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