私はSpring Webflowプロジェクトに取り組んでいますが、junitテストにmysqlではなくHSQLDBを使用できると考えていますか?
mysql データベースを HSQLDB にクローンするにはどうすればよいですか
スプリング 3.1 以降を使用している場合は、スプリング プロファイルを使用してこれを実現できます。アクティブなプロファイルが設定されていない場合、デフォルトのプロファイルがロードされます。
<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;
}
}
作成された DB に接続するには、DB url として次のようなものを使用するだけです。
String url = "jdbc:mysql:mxj://localhost:" + port + "/" + dbName;
よろしく、