【问题标题】:Simulate / Mock a MySql Database for Unit Testing模拟/模拟 MySql 数据库以进行单元测试
【发布时间】: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


【解决方案1】:

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

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

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

所以,有几个问题将帮助您回答:您是否在做任何与 MySQL 相关的事情?您希望您的应用可以移植到其他数据库吗?

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

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

如果两者的答案都是肯定的,那么你就有更大的问题了 :)。

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

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

【讨论】:

  • 我们的健康检查对于不同的数据库会有不同的方法。所以是的,它是可移植的,但是如果我们需要检查另一个数据库的健康状况,我们将编写另一个测试
  • 我建议你使用 jcabi maven 插件。
  • 我将如何指定版本 0.7。我尝试将<version>0.7</version> 添加到 POM 中的插件元素,但 maven 构建说找不到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2018-09-04
  • 2013-11-12
  • 2018-11-21
相关资源
最近更新 更多