模拟/模拟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数据库进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章