Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模拟/模拟MySql数据库进行单元测试_Java_Mysql_Unit Testing_Mockito_Powermock - Fatal编程技术网

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

Java 模拟/模拟MySql数据库进行单元测试,java,mysql,unit-testing,mockito,powermock,Java,Mysql,Unit Testing,Mockito,Powermock,对于我们的应用程序,我们创建了一系列健康检查。其中一个健康检查检查MySql数据库是否已启动并正在运行。为了单元测试这个功能,我需要模拟或模拟一个数据库,并对其运行健康检查 要建立到正在检查的MySql数据库的连接,我们使用DriverManager.getConnection()。因此,我们首先尝试模拟getConnection()的返回值。但是,这是一个静态方法,Mockito无法对其进行模拟。然后我们转向Powermock,因为它能够模拟静态方法。不幸的是,我们发现JUnit5对它的支持很

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

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

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


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

一个选项是使用mysql jcabi maven插件:mysql.jcabi.com

请注意版本>0.7在Windows上不工作

这将实际设置一个MySQL实例,因此它允许测试非常特定于MySQL的内容,尽管第一次运行很慢

所以,有几个问题可以帮助你回答:你有没有做一些非常具体的事情?您是否希望您的应用程序可移植到其他数据库

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

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

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

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


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

另一个选项是jcabi mysql maven插件:请注意版本>0.7在Windows上不起作用。(我将在回答中展开)如果你真的想测试MySQL,那么为什么不在某个地方建立一个专用的测试数据库呢?为什么不建立一个本地MySQL数据库,并使用它进行测试呢?提供数据库选项作为框架的设置。由于测试不可移植,因此设置本地数据库有点困难。这是为了进行单元测试,因此必须在任何地方、任何时候运行。healthcheck将为不同的数据库提供不同的方法。是的,它是可移植的,但是如果我们需要检查另一个数据库的运行状况,我们将编写另一个测试。我建议您使用jcabi maven插件。我将如何指定版本0.7。我试图将
0.7
添加到POM中的plugin元素中,但是maven构建说找不到它。