忍者ブログ

「iBatisでDBUnit」の詳細記事: Javaってまだいけますか

Javaってまだいけますか

いっぱいいっぱいで無理なので学んだ事をいちいちメモっていくブログです。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Navigation

iBatisでDBUnit

iBatisをつかっSQLバッチアプリでDBUnitを使ったテストをやりやすくする為に作った共通スーパークラスをメモ。

利用イメージはこんな感じです。

public void testRegistCompany() throws Exception {
insertTestData("testdata/会社マスタ登録_テストデータ.xls");

sqlMap.update("Company.regist", new Object[]{"C001", "株式会社○○"});

// 登録後データを期待値Excelと比較
assertAfterUpdate("testdata/会社マスタ登録_期待値.xls", "Company", "companyCode");
}

public abstract class AbstractDBUnitTest extends TestCase {
/** 対象スキーマ */
public static final String SCHEMA_NAME = "スキーマ名";

/** iBatis */
protected SqlMapClient sqlMap = SqlMapManager.getInstance();

private IDatabaseConnection idbConnection;

/*
* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();

try {
// テストメソッド開始前のトランザクション開始
sqlMap.startTransaction();

idbConnection = new DatabaseConnection(getConnection(), SCHEMA_NAME);
} catch (Exception e) {
sqlMap.endTransaction();

throw e;
}
}

/*
* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();

// テスト終了後にロールバック、及びコネクション切断
sqlMap.endTransaction();
}

/**
* テストデータ投入(ファイル名複数指定).
* <pre>
* テストファイルへのクラスパスを指定します。
* 例)
* insertTestData(new String[]{"testdata/データ1.xls", "testdata/データ2.xls"});
* </pre>
* @param fileNames
* @throws Exception
*/
protected void insertTestData(String[] fileNames) throws Exception {
if(fileNames != null) {
for (int i = 0; i < fileNames.length; i++) {
String fileName = fileNames[i];

insertTestData(fileName);
}
}
}

/**
* テストデータ投入(ファイル名単一指定).
* <pre>
* テストファイルへのクラスパスを指定します。
* 例)
* insertTestData("testdata/データ1.xls");
* </pre>
*
* @param fileName
* @throws Exception
*/
protected void insertTestData(String fileName) throws Exception {
IDataSet dataSet =
new XlsDataSet(ResourceUtil.getStream(fileName));

DatabaseOperation.CLEAN_INSERT.execute(idbConnection, dataSet);
}

/**
* @return 生のコネクション
* @throws SQLException
*/
protected Connection getConnection() throws SQLException {
return sqlMap.getCurrentConnection();
}

/**
* 登録/更新後のテーブルの検証
*
* @param expectedFileName 期待値を記入したExcelファイル名(クラスパス)
* @param tableName 検証対象テーブル名
* @param sortedColumns 比較時にデータをソートする基準となるカラム名(複数指定)
* @throws Exception
*/
protected void assertAfterUpdate(String expectedFileName, String tableName, String[] sortedColumns) {
try {
ReplacementDataSet rd =
new ReplacementDataSet(
new XlsDataSet(ResourceUtil.getStream(expectedFileName)));
rd.addReplacementSubstring(" ", ""); // char型の比較時に空白が邪魔になる為

ITable expected = rd.getTable(tableName);

ReplacementDataSet actualDataSet = new ReplacementDataSet(idbConnection.createDataSet());
actualDataSet.addReplacementSubstring(" ", ""); // char型の比較時に空白が邪魔になる為
ITable actual = actualDataSet.getTable(tableName);

// SortedTableでソートして比較
Assertion.assertEquals(
new SortedTable(expected, sortedColumns),
new SortedTable(new CompositeTable(expected.getTableMetaData(), actual), sortedColumns)
);
} catch(Exception e) {
fail(ExceptionUtils.getFullStackTrace(e));
}
}

/**
* 登録/更新後のテーブルの検証(データソート指定無し)
*
* @param expectedFileName 期待値を記入したExcelファイル名
* @param tableName 検証対象テーブル名
* @throws Exception
*/
protected void assertAfterUpdate(String expectedFileName, String tableName) {
this.assertAfterUpdate(expectedFileName, tableName, new String[]{});
}

/**
* 登録/更新後のテーブルの検証(データソートカラム単一指定)
*
* @param expectedFileName 期待値を記入したExcelファイル名
* @param tableName 検証対象テーブル名
* @param sortedColumns 比較時にソートする基準となるカラム名(単一指定)
* @throws Exception
*/
protected void assertAfterUpdate(String expectedFileName, String tableName, String sortedColumn) {
this.assertAfterUpdate(expectedFileName, tableName, new String[]{sortedColumn});
}

}


ファイルのクラスパスからInputStreamを取得するResourceUtil.getStream()はこんな感じ。


/**
* @param resource
* @return リソース名からInputStreamを取得
*/
public static InputStream getStream(String resource) {
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
if(is == null) {
throw new RuntimeException("リソースの読み込みに失敗しました。:" + resource);
}
return is;
}

プロジェクトのsrc/test/resources配下にテストデータと期待値Excelファイルを格納しておきます。

難点は、テストデータがDELETE INSERTなので、もともとテーブルに大量のデータが入っているとちょー遅いこと。。。
テーブルが空っぽのUT用のデータベースを用意すればいいんでしょうか。

あと、DBUnitをMaven2経由で利用したときに依存しているPOIのバージョンで、Excelを読み込んだときに値に空白が付加されるバグがあってはまりました。
pom.xmlを書き換えてPOIのバージョンを3.1-FINALにしたら解決しました。
PR

Navigation

「iBatisでDBUnit」にトラックバックする

「iBatisでDBUnit」へのトラックバック

「iBatisでDBUnit」へのコメント

「iBatisでDBUnit」にコメントする

コメント作成

Navigation

Copyright ©  Javaってまだいけますか  All Rights Reserved.
  • 忍者ブログ
  • [PR]

menu

ブログ内検索

カテゴリー

カウンター

忍者アド

リンク

最新CM

[07/17 セバ]
[12/27 NONAME]

最新記事

(10/15)
(10/01)
(08/12)
(08/12)
(08/11)

プロフィール

HN:
takacy.k
年齢:
44
性別:
男性
誕生日:
1979/08/13
趣味:
自己紹介:
個人的なメモですので、投稿内容について真偽を保証するものではありません。また、当ブログの内容をご利用になったことによる(以下略)

最新TB

RSS

アーカイブ

アクセス解析