java - 使用 H2 数据库对 DAO 层进行单元测试

标签 java postgresql unit-testing h2 dao

在互联网上大量阅读之后,我发现使用像 H2 这样的内存数据库来对 DAO 层进行单元测试似乎是一个很好的做法。背后的想法是避免使用生产数据库。

很好,所以我设置了一个 H2 数据库并激活了 H2 PostgreSQL 兼容模式,因为我的生产数据库在 Postgres 上。我现在面临的问题:当我在 H2 上运行原始 SQL 查询以构建测试数据库时,H2 不接受此查询为有效:

ALTER SEQUENCE MYERP.ecriture_comptable_id_seq OWNED BY MYERP.ecriture_comptable.id;

我猜想使用 PostgreSQL 兼容模式并不能保证所有 Postgres 特定语法都会被 H2 接受。并且其他数据库(例如 MySQL)可能也会发生这种情况。

那么在这种情况下使用 h2 数据库有什么意义呢? 我错过了什么吗?

最佳答案

单元测试应该专注于测试一个单元。 PostgreSQL 在您的应用程序外部,因此通常不是使用它的任何 DAO 的一部分:不应编写使用任何此类外部数据库的“单元测试”。

使用数据库进行集成测试可能没问题,但正如您已经注意到的那样,当您使用不同的数据库执行集成测试时可能会出现多个问题(我知道很少有应用程序只使用 ANSI-SQL 而没有任何触发器或其他供应商特定的 SQL 扩展,例如 PostgreSQL 案例中的 UPSERT 或您帖子中的 SQL)。

如果您的生产基地也在内存中怎么办?这非常困难,我认为集成测试会很好,只是不要称之为单元测试。所有这些只是突出了在您的数据库中执行业务逻辑(例如,通过您现在无法测试的触发器)或使用供应商特定的 sql 的痛点,这些供应商特定的 sql 具有几个优势,但在更改基础数据库供应商时效果不佳。

关于java - 使用 H2 数据库对 DAO 层进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56891415/

相关文章:

PostgreSQL 返回和 sql 元组描述不兼容

unit-testing - 如何在 BDD/TDD 中对私有(private)方法进行单元测试?

ios - Swift 单元测试模拟类静态方法

java - Spring 模型对象

java - 什么时候使用验证?

java - 如何将匿名 JavaScript 对象从 Java 传递到 GWT 中的 JavaScript?

postgresql - Postgres 子查询可以访问更高级别表中的列。这是一个错误吗?还是我不明白的功能?

mysql - 关系数据库与对象关系数据库

unit-testing - 如何将unittest.dart包含在我的项目中?

java - 收到错误消息,提示我的数组大小