有没有办法在内存中运行MySQL的JUnittesting用例?
我只是试图添加访问MySQL数据库的服务的testing用例,我想重新创build整个模式(对于某些场景,也只是使用MySQL转储文件和每个testing用例所需的数据)。 我环顾四周,发现有些人使用SQLite / H2和其他人来做到这一点,但是我只是在徘徊,如果有任何方式在内存中运行MySQL,所以我不需要担心任何特定于MySQL我可能会使用我们的服务方言。
我们使用MySQL和flyway来处理迁移。
对于unit testing和简单的集成testing,我们在内存数据库中使用H2,使用MODE = MySQL参数。 Mode = MySQL使H2数据库能够处理大部分的MySQL方言。
我们在Springconfiguration中的testing数据源是这样设置的:
<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会转换成调用新的BasicDataSource,然后在创build的实例上调用setDriverClassName和setUrl)
然后,我们在数据源上使用flyway来创build模式,并像读取常规的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,然后使用<jdbc:initialize-database...>
标记运行一些SQL脚本或运行多个MySQL脚本。
使用与MySQL完全兼容的内存数据库,可以在JUnittesting用例中使用的最简单方法是使用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", "");
一个startupt脚本可以通过
database.source("path/to/resource.sql");
有关GitHub自述文件的更多信息: https : //github.com/vorburger/MariaDB4j
这是使用专有SQL扩展通常不是一个好主意的原因之一。
我要做的是尝试确定使用非标准SQL的位置,并重构代码以将这些部分移至专用服务。 然后你可以在运行unit testing时嘲笑这些。
您可以为JUnittesting使用不同的模式。 如果您使用的是Spring,那么JUnit扩展允许每个testing在只读事务中运行,所以在testing之后数据库中没有任何数据将被持久化。 如果您需要testing的初始数据,则将所需的数据放入参与事务的@Before
标记的方法中。
你可以挂载一个ramdrive(使用ImDisk),拷贝你的数据文件,然后在my.cnfunit testing数据库中更改适当的configuration后启动Mysql服务,这些数据库通常很小(为了快速testing你应该保留它们很小),它们可以通常适合在一个ramdrive。
您也可以考虑在您的弹簧testing中使用事务,而不是在每次testing时重build表。
我们用它来开发我们的团队,它像一个魅力,我们获得了一个数量级的速度。
尝试http://hsqldb.org/ ,我没有经验,但听到好东西。
编辑对不起 – 似乎你需要删除任何MySQL特定的语法…