The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
我在几个Java web项目中使用MySQL,发现没有Maven插件可以帮助我针对真实的MySQL服务器测试我的DAO。有很多机制可以在内存和磁盘上模拟数据库持久化层。然而,确保你的类被针对与生产环境中完全相同的数据库进行测试总是很好的。
我创建了自己的Maven插件,jcabi-mysql-maven-plugin,它只做两件事情:在pre-integration-test
阶段启动MySQL服务器,并在post-integration-test
阶段关闭它。
这是你在pom.xml
中如何配置它(还可以查看其完整的使用指南):
上面配置了两个插件。让我们来看看它们各自的功能是什么。
maven-dependency-plugin
正在下载一个MySQL发行版的压缩包(一个相当大的文件,对于Linux而言超过300Mb),并对其进行解压。该压缩包包含了与传统的MySQL安装所需的完全相同的文件。当压缩包被解压后,它就可以作为一个正常的MySQL服务器开始提供SQL请求的服务。jcabi-mysql-maven-plugin
启动一个服务器,将其绑定到一个随机保留的 TCP 端口。我的 Maven 插件的主要责任是确保 MySQL 服务器在每个平台(Mac OS、Linux、Windows)上正确启动,并在不再需要时停止。其余的工作都由 MySQL 发行版自己完成。maven-failsafe-plugin
在integration-test
阶段运行单元测试。它与maven-surefire-plugin的主要区别在于,当某些测试失败时,它不会导致构建失败。相反,它将所有失败保存在target
目录下的附加文件中,并允许构建继续进行。稍后,当我们调用其verify
目标时,如果在执行integration-test
目标时出现任何错误,它将导致构建失败。
准确来说,这是Maven执行配置目标的顺序:
运行mvn clean install
,并查看它的工作情况。如果由于某种原因无法正常工作,请毫不犹豫地向GitHub报告问题。
现在是时候创建一个集成测试了,它将连接到临时MySQL服务器,在其中创建一个表并插入一些数据。这只是一个示例,用于显示MySQL服务器正在运行并能够提供事务服务(我正在使用jcabi-jdbc)。
如果您使用Hibernate,只需在src/test/resources
目录中创建一个db.properties
文件。在该文件中,您可以做一些类似以下的操作:
Maven在资源复制过程中会用预留的TCP端口号${mysql.port}
替换掉它。这个操作被称为”资源过滤”,你可以在这里了解更多。
基本上就是这样了。我在几个项目中使用jcabi-mysql-maven-plugin,它帮助我确保我的代码可以与真实的MySQL服务器一起工作。我还使用Liquibase Maven 插件来为应用程序填充一个空服务器所需的表。不过,这是下一篇文章的故事了。
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:14