【发布时间】:2018-08-09 01:53:54
【问题描述】:
对于我们的应用程序,我们创建了一系列运行状况检查。其中一项健康检查检查 MySql 数据库是否已启动并正在运行。为了对该功能进行单元测试,我需要模拟或模拟数据库并对其运行健康检查。
要建立与正在检查的 MySql 数据库的连接,我们使用DriverManager.getConnection()。所以我们首先尝试模拟getConnection()的返回值。但是,这是一个静态方法,Mockito 无法模拟它。然后我们转向 Powermock,因为它能够模拟静态方法。不幸的是,我们发现 JUnit5 对它的支持很差,我们不得不用大量的依赖项来弄乱我们的 pom。更不用说代码变得过于复杂了。最后,我们决定寻找除模拟之外的其他选择。
基本上,我们的健康检查只需要确保 MySQL url、用户名和密码正确,并且数据库将接受连接。理想情况下,我们的单元测试将反映这些要求。
因此,我们的下一个想法是使用 In-Memory 数据库,例如来自 Baeldung 的 one。这似乎是一个不错的选择,但我担心它的行为方式与真正的 MySQL 数据库不同。有没有办法创建 In-memory MySQl 数据库并与DriverManager.getConnection() 建立连接?这将有效地模拟我们现实生活中的健康检查
【问题讨论】:
-
另一个选项是 jcabi mysql maven 插件:mysql.jcabi.com 请注意版本 > 0.7 不适用于 Windows。 (我会在答案中展开)
-
如果你真的想测试 MySQL,那么为什么不在某个地方建立一个专用的测试数据库呢?
-
为什么不设置一个本地 mysql 数据库,然后用它来测试呢?提供数据库选项作为框架的设置。
-
设置本地数据库有点挑战,因为测试不可移植。
-
这是为了单元测试,所以必须随时随地运行
标签: java mysql unit-testing mockito powermock