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

问题描述 投票:0回答:1

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

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

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

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

java mysql unit-testing mockito powermock
1个回答
0
投票

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

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

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

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.