gpt4 book ai didi

java - 模拟/模拟 MySql 数据库以进行单元测试

转载 作者:行者123 更新时间:2023-11-29 17:13:37 25 4
gpt4 key购买 nike

对于我们的应用程序,我们创建了一系列健康检查。其中一项健康检查检查 MySql 数据库是否已启动并正在运行。为了对该功能进行单元测试,我需要模拟或模拟数据库并对其运行运行状况检查。

为了建立与正在检查的 MySql 数据库的连接,我们使用 DriverManager.getConnection()。因此我们首先尝试模拟 getConnection() 的返回值。然而,这是一个静态方法,Mockito 无法模拟它。然后我们转向 Powermock,因为它能够模拟静态方法。不幸的是,我们发现 JUnit5 对它的支持很差,我们不得不用大量的依赖项来搞乱我们的 pom。更不用说代码变得过于复杂了。最后,我们决定寻找除了 mock 之外的其他选择。

基本上,我们的健康检查只需要确保 MySQL url、用户名和密码正确,并且数据库将接受连接。理想情况下,我们的单元测试将反射(reflect)这些要求。

所以,我们的下一个想法是使用内存数据库,就像这样 one来自拜尔东。这似乎是一个不错的选择,但我担心它的行为方式与真正的 MySQL 数据库不同。有没有办法创建内存中的MySQl数据库并与DriverManager.getConnection()建立连接?这将有效地模拟我们现实生活中的健康检查

最佳答案

一种选择是使用 mysql jcabi maven 插件:mysql.jcabi.com

请注意版本 > 0.7 不适用于 Windows。

这实际上会设置一个 MySQL 实例,因此它允许测试非常特定于 mysql 的东西,尽管第一次运行很慢。

因此,有几个问题将有助于您回答:您是否在做任何高度 MySQL 特定的事情?您希望您的应用程序能够移植到其他数据库吗?

如果第一个答案是肯定的,而第二个答案是否定的,则可能使用 jcabi 插件。

如果第一个问题的答案是否定的,第二个问题的答案是肯定的,那么您使用 H2 可能非常安全。

如果两者的答案都是肯定的,那么您就会遇到更大的问题:)。

我通常会尝试让我的代码远离数据库供应商的特定性,并使用 JPA 等库来抽象它。然后,我可以假设 JPA(和 impl)已经在支持的数据库上进行了测试,并且我足以使用 H2 等内存数据库运行单元和集成测试。

我通常还会在类似产品的环境中进行一些端到端测试,并使用与产品相同的数据库设置,以涵盖任何特定于供应商的怪癖。

关于java - 模拟/模拟 MySql 数据库以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51757805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com