我正在开发一个spring webflow项目,我在想我可以使用HSQLDB而不是我的mysql来进行junit测试吗?
如何将我的 mysql 数据库克隆到 HSQLDB
如果您使用的是 spring 3.1 或更高版本,则可以使用 spring 配置文件来实现这一点。未设置活动配置文件时会加载默认配置文件。
<beans profile="dev">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="org.hsqldb.jdbcDriver" />
...other datasource properties also create or drop db
</bean>
</beans>
<beans profile="default">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
...other datasource properties
</bean>
</beans>
在您的单元测试中,通过添加注释来设置活动配置文件。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:app-config.xml")
@ActiveProfiles("dev")
public class TransferServiceTest {
除了建议之外,请考虑根据您的需要,HSQL 和 MySQL 没有相同的功能,如合并连接和其他 SQL 非标准功能。因此(在我们的例子中),我们总是在嵌入式 Mysql 上运行我们的测试。
嵌入式 MySQL 随 mysql-connector-mxj 一起提供。如果你使用 Maven,你可以像这样得到它:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-mxj</artifactId>
<version>5.0.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-mxj-db-files</artifactId>
<version>5.0.12</version>
</dependency>
一旦驱动程序在您的项目路径上,您就可以从 Java 启动数据库。在我们的例子中,我们有这个启动数据库的实用程序类:
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mysql.management.MysqldResource;
import com.mysql.management.MysqldResourceI;
public class EmbeddedMySQLDb {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
private MysqldResource mysqldResource;
private String baseDatabaseDir = System.getProperty("java.io.tmpdir");
private String databaseName = "test_db_" + System.nanoTime();
private int port = 13306;
private String username = "root";
private String password = "password";
/**
* Starts the mysql database
* @return
*/
public void startDatabase() {
if (logger.isDebugEnabled()) {
logger.debug("=============== Starting Embedded MySQL using these parameters ===============");
logger.debug("baseDatabaseDir : " + baseDatabaseDir);
logger.debug("databaseName : " + databaseName);
logger.debug("host : localhost (hardcoded)");
logger.debug("port : " + port);
logger.debug("username : " + username);
logger.debug("password : " + password);
logger.debug("=============================================================================");
}
File databaseDir = new File(new File(baseDatabaseDir), databaseName);
mysqldResource = new MysqldResource(databaseDir);
Map<String, String> database_options = new HashMap<String, String>();
database_options.put(MysqldResourceI.PORT, Integer.toString(port));
database_options.put(MysqldResourceI.INITIALIZE_USER, "true");
database_options.put(MysqldResourceI.INITIALIZE_USER_NAME, username);
database_options.put(MysqldResourceI.INITIALIZE_PASSWORD, password);
mysqldResource.start("embedded-mysqld-thread-" + System.currentTimeMillis(),
database_options);
if (!mysqldResource.isRunning()) {
throw new RuntimeException("MySQL did not start.");
}
logger.info("MySQL started successfully @ " + System.currentTimeMillis());
}
/**
* Shutdowns the mysql database
* @return
*/
public void shutdownDatabase() {
mysqldResource.shutdown();
if (mysqldResource.isRunning() == false) {
logger.info(">>>>>>>>>> DELETING MYSQL BASE DIR [" + mysqldResource.getBaseDir() + "] <<<<<<<<<<");
try {
FileUtils.forceDelete(mysqldResource.getBaseDir());
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
//-------------------------------------------------------------------------
/**
* @return the baseDatabaseDir
*/
public final String getBaseDatabaseDir() {
return baseDatabaseDir;
}
/**
* @param baseDatabaseDir the baseDatabaseDir to set
*/
public final void setBaseDatabaseDir(String baseDatabaseDir) {
this.baseDatabaseDir = baseDatabaseDir;
}
/**
* @return the databaseName
*/
public final String getDatabaseName() {
return databaseName;
}
/**
* @param databaseName the databaseName to set
*/
public final void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
/**
* @return the port
*/
public final int getPort() {
return port;
}
/**
* @param port the port to set
*/
public final void setPort(int port) {
this.port = port;
}
/**
* @return the username
*/
public final String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public final void setUsername(String username) {
this.username = username;
}
/**
* @return the password
*/
public final String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public final void setPassword(String password) {
this.password = password;
}
}
要在创建后连接到数据库,您只需使用如下所示的数据库 url:
String url = "jdbc:mysql:mxj://localhost:" + port + "/" + dbName;
问候,