对于我们的应用程序,我们创建了一系列运行状况检查。这些运行状况检查之一将检查MySql数据库是否已启动并正在运行。为了对该功能进行单元测试,我需要模拟或模拟数据库并对数据库进行运行状况检查。
要建立与要检查的MySql数据库的连接,我们使用DriverManager.getConnection()
。因此,我们首先尝试模拟getConnection()
的返回值。但是,这是一个静态方法,Mockito无法模拟它。然后我们转向Powermock,因为它能够模拟静态方法。不幸的是,我们发现JUnit5对它的支持很差,并且我们不得不将pom的很多依赖弄得一团糟。更不用说代码变得过于复杂。最后,我们决定寻找模拟之外的其他选项。
基本上,我们的运行状况检查仅需要确保MySQL url,用户名和密码正确且数据库将接受连接。理想情况下,我们的单元测试将反映这些要求。
因此,我们的下一个想法是使用内存数据库,例如Baeldung的one。这似乎是一个不错的选择,但我担心它的行为不会像真正的MySQL数据库那样。有没有办法创建内存MySQl数据库并与DriverManager.getConnection()
建立连接?这将有效地模拟我们的现实健康检查
答案 0 :(得分:0)
一种选择是使用mysql jcabi maven插件:mysql.jcabi.com
请注意,版本> 0.7在Windows上不起作用。
这实际上将设置一个MySQL实例,因此它允许测试非常特定于mysql的东西,尽管第一次运行很慢。
因此,有几个问题将帮助您回答:您是否在做某些特定于MySQL的事情?您希望您的应用程序可移植到其他数据库吗?
如果第一个答案为是,第二个答案为否,请使用jcabi插件。
如果第一个答案为否,第二个答案为是,那么使用H2可能很安全。
如果两个答案都是肯定的,那么您就遇到了更大的问题:)。
我通常尝试使我的代码远离数据库供应商的特定性,并使用JPA之类的库来抽象此代码。然后,我可以假设JPA(和impl)已经在受支持的DB上进行了测试,并且我足以在H2之类的内存DB中运行单元和集成测试。
为了覆盖任何特定于供应商的怪癖,我通常还会在类似prod的env中进行一些端到端测试,并使用与prod相同的数据库设置。