模拟/模拟mysql数据库进行单元测试

u0sqgete  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(682)

对于我们的应用程序,我们创建了一系列健康检查。其中一个健康检查检查mysql数据库是否已启动并运行。为了对这个功能进行单元测试,我需要模拟或模拟一个数据库并对其运行健康检查。
为了建立与正在检查的mysql数据库的连接,我们使用 DriverManager.getConnection() . 因此,我们首先尝试模拟 getConnection() . 但是,这是一个静态方法,mockito无法模拟它。然后我们转向powermock,因为它能够模拟静态方法。不幸的是,我们发现junit5对它的支持很差,我们不得不用大量的依赖性来整理pom。更不用说代码变得过于复杂了。最后,我们决定在嘲笑之外寻找其他的选择。
基本上,我们的健康检查只需要确保mysql url、用户名和密码正确,并且数据库将接受连接。理想情况下,我们的单元测试将反映这些需求。
所以,我们的下一个想法是使用内存数据库,就像这个来自baeldung的数据库。这似乎是一个很好的选择,但我担心它不会像真正的mysql数据库那样运行。有没有办法创建内存中的mysql数据库并与 DriverManager.getConnection() ? 这将有效地模拟现实生活中的健康检查

gblwokeq

gblwokeq1#

一种选择是使用mysql jcabi maven插件:mysql.jcabi.com
请注意版本>0.7在windows上不工作。
这实际上会设置一个mysql示例,因此它允许一个人测试特定于mysql的东西,尽管第一次运行很慢。
所以,有几个问题可以帮助你给出答案:你在做什么特别的事情吗?你希望你的应用程序可以移植到其他数据库吗?
如果第一个答案是肯定的,第二个答案是否定的,那么可以使用jcabi插件。
如果第一个答案是否定的,第二个答案是肯定的,那么使用h2可能是相当安全的。
如果两个答案都是肯定的,你就有更大的问题:)。
我通常会尽量让代码远离db供应商的特定性,并使用jpa之类的库来抽象这一点。然后我可以假设jpa(和impl)已经在受支持的dbs上进行了测试,并且我已经足够好地使用内存中的db(如h2)运行单元和集成测试。
我通常也会在prod-like-env中进行一些端到端测试,使用与prod相同的db设置,以涵盖任何特定于供应商的怪癖。

相关问题