DBUnit と JUnit4を組み合わせて使ってみました。
org.dbunit.DatabaseTestCase のsetUpメソッド辺りを読むとわかるのですが、Testクラスに継承されるクラスは、ほとんどの処理をIDatabaseTesterに移譲しています。
JUnitのテストケースのsetUpメソッド内で、IDatabaseTestCase.onSetup() を、tearDown内でonTearDown()を呼ぶ感じです。
あとは、その際の挙動に関する設定をsetしていっているイメージです。
なので、同じことをJUnit4では、@Beforeや、@Afterがついているメソッドで同じようなことをやってあげればいいわけですが、大量のテストクラスに全部書くのは面倒なので共通化したい。
というわけで、ExternalResourceを作ってみました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package dbunit; | |
import org.dbunit.IDatabaseTester; | |
import org.dbunit.IOperationListener; | |
import org.dbunit.dataset.IDataSet; | |
import org.dbunit.operation.DatabaseOperation; | |
import org.junit.rules.ExternalResource; | |
/** | |
* Usage : | |
* | |
* like this. | |
* | |
* class SomeTest { | |
* @Rule | |
* public final DBUnit dbunit; | |
* | |
* public SomeTest() throws DataSetException { | |
* dbunit = new DBUnit( | |
* new JdbcDatabaseTester("some.Driver","jdbc:someurl","user","pass"), | |
* DatabaseOperation.CLEAN_INSERT, null, new CsvDataSet(new File("./src/test/dataset/default")), null); | |
* } | |
* } | |
* | |
* @author gensan | |
*/ | |
public class DBUnit extends ExternalResource { | |
private final IDatabaseTester databaseTester; | |
private final DatabaseOperation setupOperation; | |
private final DatabaseOperation tearDownOperation; | |
private final IDataSet dataSet; | |
private final IOperationListener operationListener; | |
public DBUnit(IDatabaseTester databaseTester, | |
DatabaseOperation setupOperation, DatabaseOperation tearDownOperation, IDataSet dataSet, | |
IOperationListener operationListener) { | |
this.databaseTester = databaseTester; | |
this.setupOperation = setupOperation == null ? DatabaseOperation.CLEAN_INSERT : setupOperation; | |
this.tearDownOperation = tearDownOperation == null ? DatabaseOperation.NONE : tearDownOperation; | |
this.dataSet = dataSet; | |
this.operationListener = operationListener; | |
} | |
@Override | |
protected void before() throws Throwable { | |
final IDatabaseTester databaseTester = getDatabaseTester(); | |
databaseTester.setSetUpOperation(getSetUpOperation()); | |
databaseTester.setDataSet(getDataSet()); | |
databaseTester.setOperationListener(getOperationListener()); | |
databaseTester.onSetup(); | |
} | |
protected IOperationListener getOperationListener() { | |
return operationListener; | |
} | |
protected IDataSet getDataSet() { | |
return dataSet; | |
} | |
protected DatabaseOperation getSetUpOperation() { | |
return setupOperation; | |
} | |
protected IDatabaseTester getDatabaseTester() { | |
return databaseTester; | |
} | |
@Override | |
protected void after() { | |
try { | |
final IDatabaseTester databaseTester = getDatabaseTester(); | |
databaseTester.setTearDownOperation(getTearDownOperation()); | |
databaseTester.setDataSet(getDataSet()); | |
databaseTester.setOperationListener(getOperationListener()); | |
databaseTester.onTearDown(); | |
} catch (Exception e) { | |
throw new RuntimeException(e); | |
} | |
} | |
protected DatabaseOperation getTearDownOperation() { | |
return tearDownOperation; | |
} | |
} |
こんな感じ。
使い方はJavadocにチラッと書いてあるとおり、@Ruleをつけてフィールドとして宣言します。
コンストラクタの引数は、設定です。詳細はDBUnitを参照してください。
使い方はJavadocにチラッと書いてあるとおり、@Ruleをつけてフィールドとして宣言します。
コンストラクタの引数は、設定です。詳細はDBUnitを参照してください。
コメント