有没有办法在内存中为JUnit测试用例运行MySQL?
我只是尝试为访问MySQL DB的服务添加测试用例,并且我想重新创建整个架构(对于某些方案,也只是使用MySQL转储文件以及每个测试用例所需的数据)。我四处寻找,发现有些人使用SQLite / H2和其他人来做这件事,但是如果有任何方法可以在内存中运行MySQL,我只是在徘徊,所以我不需要担心任何特定于MySQL方言的事情,我可能会在我们的服务上使用。
我只是尝试为访问MySQL DB的服务添加测试用例,并且我想重新创建整个架构(对于某些方案,也只是使用MySQL转储文件以及每个测试用例所需的数据)。我四处寻找,发现有些人使用SQLite / H2和其他人来做这件事,但是如果有任何方法可以在内存中运行MySQL,我只是在徘徊,所以我不需要担心任何特定于MySQL方言的事情,我可能会在我们的服务上使用。
使用与MySQL完全兼容并且可以在JUnit测试用例中使用的内存数据库的最简单方法是imho MariaDB4j。你只需要一个Gradle(/Maven)依赖项(http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22mariaDB4j%22)和几行代码即可开始:
DB database = DB.newEmbeddedDB(3306);
database.start();
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");
启动脚本可以通过以下方式包含
database.source("path/to/resource.sql");
有关 GitHub 自述文件的更多信息:https://github.com/vorburger/MariaDB4j
编辑:我有一个添加一些提示到这个答案:MariaDB4j似乎在系统临时文件夹中添加文件。因此,它将以嵌入式方式工作,这意味着无需安装任何内容,您可以通过所需的构建工具使用依赖项。但它不是一个真正的仅内存中解决方案,因此我们不能再谈论单元测试了,因为单元测试不能依赖于文件或数据库。
我们使用MySQL和flyway来处理迁移。
对于单元测试和简单的集成测试,我们使用带有参数的 H2 内存中数据库。 使 H2 DB 能够处理大部分 MySQL 方言。MODE=MySQL
Mode=MySQL
我们在Spring配置中的测试数据源设置如下:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" />
</bean>
(如果您不知道Spring - XML转换为调用,然后调用和创建的实例)new BasicDataSource
setDriverClassName
setUrl
然后,我们在数据源上使用 Flyway 来创建架构并读取,就像我们针对常规 MySQL 数据库一样:
<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate">
<property name="dataSource" ref="dataSource" />
<property name="cleanOnValidationError" value="false" />
<property name="initOnMigrate" value="true" />
<property name="sqlMigrationSuffix" value=".ddl" />
</bean>
您也可以在jdbcTemplate中使用dataSource bean,并以这种方式运行一些SQL脚本,或者使用标签运行许多MySQL脚本。<jdbc:initialize-database...>