【问题标题】:How do I mock database tables using java and mockito? (springboot, mockito)如何使用 java 和 mockito 模拟数据库表? (弹簧靴,模仿)
【发布时间】:2021-09-10 22:28:16
【问题描述】:

我需要能够在 mockito 中模拟一个表来测试查询。

即我有一个谓词

public Preciate makePredicate(){
 return criteriaBuilder.like(tableRoot.get(col), "test"); 
}

我希望能够测试这样的东西

criteriaQuery.where(makePredicate());
ResultSet res = criteriaQuery.getResultSet();

并验证 res 中的值

我需要能够模拟数据库的表并能够将模拟值插入到表中,但我不知道该怎么做。

【问题讨论】:

    标签: java spring-boot unit-testing testing mockito


    【解决方案1】:

    模拟表对于您的测试来说是错误的抽象级别,除非您正在编写某种非常低级的数据库库。

    在你的情况下,你会

    • 只需依赖内存数据库进行集成测试,这样您就可以正确测试与数据库的交互,尤其是在您使用 JDBC 时。我认为此选项适合您,因为您的操作水平似乎与数据库非常接近(结果集、标准构建器等)。在使用内存数据库的集成测试中,也很容易将数据插入表中。然后,您的测试将涵盖很多内容。
    • 选择仅在没有 DB 的情况下进行纯单元测试,并在与 DB 进行交互的服务级别进行模拟。但是请注意,在这种情况下,您将无法测试与 JDBC 相关的代码

    我会亲自参与内存数据库的集成测试。

    一般来说,您不想模拟 JDBC 库或数据库,因为那是不可能的,并且需要大量了解 JDBC 和 DB 之间的底层调用。

    【讨论】:

    • 为了完整起见,我只是补充一点,您还可以针对真实数据库或在容器中运行的数据库运行集成测试(请参阅 testcontainers 库)。
    • 这正是我的想法。如果类写得很好,耦合度很低,那么这应该有助于促进这一点。
    • 对不起,是的。我的问题可能不正确。这就是我想要尝试做的,拥有一个可用于测试的内存数据库,我只是无法找到如何做到这一点
    • @StackOverflowQuestion52 那么你应该修改你的问题,或者问一个新问题,解释你在使用内存数据库进行测试时遇到了什么困难。
    • 你应该问一个范围更清晰的新问题。我认为我的回答涵盖了原始问题。不幸的是,当您将问题“更新”为完全不同的内容时,很难将现有答案置于上下文中
    猜你喜欢
    • 2021-11-11
    • 2018-11-22
    • 2019-05-03
    • 2016-08-30
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多