DBUnitにさわる

DBUnitにさわった時のメモ

必要なJarファイル

asm-3.0.jar
bcel-5.2.jar
commons-beanutils.jar
commons-lang.jar
commons-logging.jar
dbunit-2.2.3-javadoc.jar
dbunit-2.2.3-sources.jar
dbunit-2.2.3.jar
djunit.jar
ibatis-2.3.0.677.jar
jakarta-oro-2.0.7.jar
jcoverage-djunit-1.0.5.jar
junit-4.4.jar
log4j.jar
ojdbc14.jar
slf4j-api-1.5.2.jar
slf4j-log4j12-1.5.2.jar

基底テストケースクラス

package examples.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ResourceBundle;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.junit.After;
import org.junit.Before;

public class DbTest {
	private IDatabaseConnection con = null;

	@Before
	public void setUp() throws Exception {
//		 IDatabaseConnection con = getConnection();
//		 // 現状のバックアップを取得
//		 QueryDataSet partialDataSet = new QueryDataSet(con);
//		 partialDataSet.addTable("SAMPLE01", "SELECT * FROM SAMPLE01");
//		 System.out.println(Arrays.toString(partialDataSet.getTableNames()));
//		 File file = new File("db.xml");
//		 FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file));
	}

	@After
	public void tearDown() throws Exception {
		if (con != null) {
			con.close();
		}
	}

	public IDatabaseConnection getConnection() throws Exception {
		if (con == null) {
			ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
			String driver = bundle.getString("jdbc.driver");
			Class.forName(driver);
			Connection connection = DriverManager.getConnection(bundle
					.getString("jdbc.url"), bundle.getString("jdbc.user"),
					bundle.getString("jdbc.password"));
			String schema = bundle.getString("jdbc.user").toUpperCase();
			con = new DatabaseConnection(connection, schema);
		}
		return con;
	}

}

テストケースクラス

package examples.dao;

import static org.junit.Assert.assertNotNull;

import java.io.InputStream;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Date;

import org.apache.commons.lang.time.DateUtils;
import org.dbunit.Assertion;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import examples.dto.Sample01;

public class Sample01DaoTest extends DbTest {

	private Sample01Dao dao;

	@Before
	public void setUp() throws Exception {
		IDatabaseConnection con = getConnection();
		InputStream in = Sample01DaoTest.class
				.getResourceAsStream("dataset.xml");
		IDataSet dataSet = new FlatXmlDataSet(in);
		String[] tableNames = dataSet.getTableNames();
		System.out.println(Arrays.toString(tableNames));
		DatabaseOperation.CLEAN_INSERT.execute(con, dataSet);
		dao = new Sample01Dao();
	}

	@After
	public void tearDown() throws Exception {
		super.tearDown();
	}

	@Test
	public void testFindByPk() throws Throwable {
		Sample01 obj = dao.findByPk(1);
		System.out.println(obj);
		assertNotNull(obj);
	}

	@Test
	public void testInsert() throws Throwable {
		Date date = DateUtils.parseDate("2008-07-01",
				new String[] { "yyyy-MM-dd" });
		Sample01 obj = new Sample01();
		obj.setId(999);
		obj.setColChar("char");
		obj.setColVarchar2("varchar2");
		obj.setColNumber(9);
		obj.setColDate(date);
		obj.setColTimestamp(new Timestamp(date.getTime()));
		dao.insert(obj);

		// DBから実際のデータの取得
		IDataSet databaseDataSet = getConnection().createDataSet();
		ITable actualTable = databaseDataSet.getTable("SAMPLE01");

		// 期待値データの取得
		IDataSet expectedDataSet = new FlatXmlDataSet(Sample01DaoTest.class
				.getResourceAsStream("dataset-insert.xml"));
		ITable expectedTable = expectedDataSet.getTable("SAMPLE01");

		// 期待値と実際のデータの比較
		Assertion.assertEquals(expectedTable, actualTable);
	}

	@Test
	public void testDelete() throws Throwable {
		Sample01 obj = new Sample01();
		obj.setId(1);
		dao.delete(obj);

		// DBから実際のデータの取得
		IDataSet databaseDataSet = getConnection().createDataSet();
		ITable actualTable = databaseDataSet.getTable("SAMPLE01");

		// 期待値データの取得
		IDataSet expectedDataSet = new FlatXmlDataSet(Sample01DaoTest.class
				.getResourceAsStream("dataset-delete.xml"));
		ITable expectedTable = expectedDataSet.getTable("SAMPLE01");

		// 期待値と実際のデータの比較
		Assertion.assertEquals(expectedTable, actualTable);
	}

	@Test
	public void testUpdate() throws Throwable {
		Sample01 obj = new Sample01();
		obj.setId(1);
		obj.setColChar("XXX");
		dao.update(obj);

		// DBから実際のデータの取得
		IDataSet databaseDataSet = getConnection().createDataSet();
		ITable actualTable = databaseDataSet.getTable("SAMPLE01");

		// 期待値データの取得
		IDataSet expectedDataSet = new FlatXmlDataSet(Sample01DaoTest.class
				.getResourceAsStream("dataset-update.xml"));
		ITable expectedTable = expectedDataSet.getTable("SAMPLE01");

		// 期待値と実際のデータの比較
		Assertion.assertEquals(expectedTable, actualTable);
	}

}

dataset.xml

<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<sample01 id="1"
          col_char="XXXX1"
          col_varchar2="XXXXXXXXX1"
          col_number="1"
          col_date="2008-07-01"
          col_timestamp="2008-07-01 00:00:00.000000000" />
<sample01 id="2"
          col_char="XXXX2"
          col_varchar2="XXXXXXXXX2"
          col_number="2"
          col_date="2008-07-02"
          col_timestamp="2008-07-02 00:00:00.000000000" />
</dataset>

dataset-insert.xml

<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<sample01 id="1"
          col_char="XXXX1"
          col_varchar2="XXXXXXXXX1"
          col_number="1"
          col_date="2008-07-01"
          col_timestamp="2008-07-01 00:00:00.000000000" />
<sample01 id="2"
          col_char="XXXX2"
          col_varchar2="XXXXXXXXX2"
          col_number="2"
          col_date="2008-07-02"
          col_timestamp="2008-07-02 00:00:00.000000000" />
</dataset>