java - 如何模拟用于测试的数据库(Java)?

标签 java database unit-testing testing jdbc

我正在使用 Java 编程,我的应用程序大量使用 DB。因此,能够轻松测试我的数据库使用情况对我来说很重要。
数据库测试的全部内容是什么?对我来说,他们应该提供两个简单的要求:

  1. 验证 SQL 语法。
  2. 更重要的是,根据给定的情况检查数据是否被正确选择/更新/插入。

那么,看来我只需要一个数据库。
但实际上,我不喜欢,因为使用数据库进行测试几乎没有困难:

  • “给自己弄个测试数据库,有多难?” - 嗯,在我的工作场所,拥有一个个人测试数据库是几乎不可能的。您必须使用所有人都可以访问的“公共(public)”数据库。
  • “这些测试肯定不快...” - DB 测试往往比通常的测试慢。慢速测试确实不太理想。
  • “这个程序应该可以处理任何情况!” - 尝试模拟数据库中的每个案例变得有些烦人甚至不可能。对于每种情况,都应该进行一定数量的插入/更新查询,这很烦人并且需要时间。
  • “等一下,你怎么知道那个表有 542 行?” - 测试的主要原则之一是能够以不同于测试代码的方式测试功能。使用数据库时,通常只有一种方法可以做某事,因此测试与核心代码完全相同。

所以,你可以发现我在测试方面不喜欢 DB(当然,我必须在某个时候做到这一点,但我宁愿稍后在我的测试中到达那里,在我发现大多数使用其余测试方法的错误)。但我在寻找什么?

我正在寻找一种方法来模拟数据库、模拟数据库、使用文件系统或仅使用虚拟内存。我认为也许有一个 Java 工具/包允许简单地构造(使用代码接口(interface))每个测试的 DB 模拟,模拟表和行,SQL 验证,以及用于监视其状态的代码接口(interface)(而不是使用 SQL )。

你熟悉这种工具吗?


编辑:感谢您的回答!虽然我要的是一个工具,但你也给了我一些关于这个问题的提示:) 我需要一些时间来查看你的报价,所以我现在不能说你的答案是否令人满意。

无论如何,这是我正在寻找的更好的 View - 想象一个名为 DBMonitor 的类,它的一个功能是查找表中的行数。这是我想如何使用 JUnit 测试该功能的虚构代码:

public class TestDBMonitor extends TestCase {

    @Override
    public void setUp() throws Exception {

       MockConnection connection = new MockConnection();

       this.tableName = "table1";
       MockTable table = new MockTable(tableName);

       String columnName = "column1";
       ColumnType columnType = ColumnType.NUMBER;
       int columnSize = 50;
       MockColumn column = new MockColumn(columnName, columnType, columnSize);
       table.addColumn(column);

       for (int i = 0; i < 20; i++) {
           HashMap<MockColumn, Object> fields = new HashMap<MockColumn, Object>();
           fields.put(column, i);
           table.addRow(fields);
       }

       this.connection = connection;
    }

    @Test
    public void testGatherStatistics() throws Exception {

       DBMonitor monitor = new DBMonitor(connection);
       monitor.gatherStatistics();
       assertEquals(((MockConnection) connection).getNumberOfRows(tableName),
                    monitor.getNumberOfRows(tableName));
    }

    String tableName;
    Connection connection;
}

我希望这段代码足够清晰,可以理解我的想法(请原谅我的语法错误,我是在没有亲爱的 Eclipse 的情况下手动输入的:P)。

顺便说一句,我部分使用 ORM,而且我的原始 SQL 查询非常简单,应该不会因平台而异。

最佳答案

Java 自带 Java DB .

也就是说,除非您通过 ORM 层,否则我建议您不要使用与您在生产中使用的不同类型的数据库。否则,您的 SQL 可能不会像您想象的那样跨平台。

还可以查看 DbUnit

关于java - 如何模拟用于测试的数据库(Java)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/928760/

相关文章:

java - 线程 "main"java.lang.NullPointerException-part2 除外

java - 嵌套 jar 中的 NoClassDefFoundError (Android)

node.js - 获取 CoreMongooseArray 而不是普通数组

android - 如何测试依赖于 CountDownTimer 的 Android 类

android - Android 上的 Realm 单元测试

java - Spring @Transactional 是否使用任何 Hibernate 缓存?

java - 从对象获取信息(JAVA)

c# - ASP.Net Core 如何在应用程序即将停止时对数据库执行最终操作

mongodb - 没有仲裁器的两个节点 MongoDB 副本集

unit-testing - Moq对IRepository传递表达式的期望