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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟/模拟MySql数据库进行单元测试相关的知识,希望对你有一定的参考价值。

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

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

基本上,我们的运行状况检查只需确保MySQL URL,用户名和密码正确,数据库将接受连接。理想情况下,我们的单元测试将反映这些要求。

因此,我们的下一个想法是使用内存数据库,就像来自Baeldung的one一样。这似乎是一个很好的选择,但我担心它不会像真正的MySQL数据库那样表现。有没有办法创建内存中的MySQl数据库并与DriverManager.getConnection()建立连接?这将有效地模拟我们的现实生活健康检查

答案

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

请注意版本> 0.7在Windows上不起作用。

这实际上将设置一个MySQL实例,所以它允许一个人测试非常mysql特定的东西,虽然第一次运行很慢。

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

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

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

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

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

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

以上是关于模拟/模拟MySql数据库进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中模拟基类属性或方法

使用模拟 MongoDB 服务器进行单元测试

junit4单元测试--web项目中模拟登录会话,做全流程测试

单元测试——使用模拟对象做交互测试

Android单元测试与模拟测试详解

现代继电器:如何模拟继电器进行单元测试