package common; import java.io.FileNotFoundException; import java.io.FileReader; import java.sql.Connection; import java.sql.DriverManager; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.database.statement.IBatchStatement; import org.dbunit.database.statement.StatementFactory; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.xml.FlatDtdDataSet; import org.dbunit.dataset.xml.FlatXmlDataSet; import org.dbunit.operation.DatabaseOperation; /** * @author n-sasaki */ public class DBUnitTestDataManager { public DBUnitTestDataManager() { } /** * テストファイル名をフィールドに設定する. * * @param testDataFile テストファイル名 */ public DBUnitTestDataManager(String testDataFile) { this.testDataFile = testDataFile; } /** * テストファイルを読み込んで, データベースへ書き込みを行う. * * @param conn org.dbunit.database.IDatabaseConnection * @throws Exception 予期しない例外が発生した場合 */ public void setUp(IDatabaseConnection conn) throws Exception { databaseProperties = getDatabaseProperties(); dataSet = createDataSet(testDataFile); if (dataSet != null) { DatabaseOperation.CLEAN_INSERT.execute(conn, dataSet); conn.getConnection().commit(); } } /** * データベース内容の全消去を行う. * * @param conn org.dbunit.database.IDatabaseConnection * @throws Exception 予期しない例外が発生した場合 */ public void tearDown(IDatabaseConnection conn) throws Exception { try { if (dataSet != null) { DatabaseOperation.DELETE_ALL.execute(conn, dataSet); conn.getConnection().commit(); } } finally { conn.close(); } databaseProperties = null; conn = null; dataSet = null; } /** * DatabasePropertiesからデータベース情報を取得し, コネクションを取得する. * * @return IDatabaseConnection org.dbunit.database.IDatabaseConnection * @throws Exception 予期しない例外が発生した場合 */ protected IDatabaseConnection getConnection() throws Exception { databaseProperties = getDatabaseProperties(); Class.forName(databaseProperties.getDriverClassName()); Connection jdbcConnection = DriverManager.getConnection( databaseProperties.getDatabaseUrl(), databaseProperties.getDatabaseUserName(), databaseProperties.getDatabasePassword()); jdbcConnection.setAutoCommit(false); return new DatabaseConnection(jdbcConnection, databaseProperties.getDatabaseSchema()); } /** * DatabasePropertiesを生成し返却する. * * @return DatabaseProperties * @throws Exception */ private DatabaseProperties getDatabaseProperties() throws Exception { return DatabaseProperties.create(); } /** * 引数で渡されたファイル名を元に, dtdファイルとxmlファイルを読み込み, IDataSetを生成し返却する. * * @param testDataFile テストファイル名 * @return IDataSet */ protected IDataSet createDataSet(String fileName) throws Exception { if (fileName == null) return null; FlatDtdDataSet dtdDataSet = null; try { dtdDataSet = new FlatDtdDataSet( new FileReader( databaseProperties.getTestDataDirectory() + "/" + fileName + ".dtd")); } catch (FileNotFoundException fnfe) { } IDataSet dataSet = null; try { if (dtdDataSet != null) { dataSet = new FlatXmlDataSet( new FileReader( databaseProperties.getTestDataDirectory() + "/" + fileName + ".xml"), dtdDataSet); } else { dataSet = new FlatXmlDataSet( new FileReader( databaseProperties.getTestDataDirectory() + "/" + fileName + ".xml")); } } catch (FileNotFoundException e) { } return dataSet; } /** * 与えられたSQLを実行する. * * @param conn org.dbunit.database.IDatabaseConnection * @param sql 実行するSQL * @throws Exception 予期しない例外が発生した場合 */ public void executeBatchStatement(IDatabaseConnection conn, String sql) throws Exception { if (sql == null) { return; } if (conn == null) { return; } String[] sqls = new String[1]; sqls[0] = sql; executeBatchStatement(conn, sqls); } /** * 与えられた複数のSQLを実行する. * * @param conn org.dbunit.database.IDatabaseConnection * @param sqls 複数の実行するSQL * @throws Exception 予期しない例外が発生した場合 */ public void executeBatchStatement(IDatabaseConnection conn, String[] sqls) throws Exception { if (sqls == null) { return; } if (conn == null) { return; } IBatchStatement batch = statementFactory.createBatchStatement(conn); for (int index = 0; index < sqls.length; index++) { batch.addBatch(sqls[index]); } batch.executeBatch(); batch.close(); } /** * テストファイル名 */ private String testDataFile = "DummyData"; private DatabaseProperties databaseProperties; private IDataSet dataSet; private StatementFactory statementFactory = new StatementFactory(); }