DBUnit
http://dbunit.sourceforge.net/
DBUnit とは
単体テスト利用するデータベースアクセスツール
データベースへの CRUD 処理のテストを行うためには初期データの登録が必要ですが、その時に使用できるのが DBUnit です!
DBUnit ライブラリ使用すればわざわざテストの為にデータベースとやり取りするロジックを作る必要がなくなります
単体テストで DBUnit を使用する方法
開発環境
- Java
- Gradle
- IntelliJ
- JUnit5
- DBUnit
- Docker-compose
build.gradle
JUnit5 と DBUnit を使用する為、build.gradle の 設定をします
dependencies {
// JUnit
testImplementation('org.junit.jupiter:junit-jupiter:5.5.2')
// DBUnit
testImplementation('org.dbunit:dbunit:2.7.0')
// Oracle JDBC
runtimeOnly("com.oracle.database.jdbc:ojdbc8:19.7.0.0")
}
// use JUnit 5 platform
test {
useJUnitPlatform()
}
docker-compose.yml
Oracle Database の Docker コンテナを使用する為、docker-compose.yml を定義します
version: '2.0'
services:
oracle:
container_name: oracle11g
image: "jaspeen/oracle-xe-11g"
ports:
- "1521:1521"
プロジェクトの構成
DBUnitTest
import org.dbunit.IDatabaseTester;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.File;
public class DBUnitTest {
private static IDatabaseTester databaseTester;
public static void loadData(String seedFile) {
try {
IDataSet dataSet = new FlatXmlDataSetBuilder().build(new File(seedFile));
DatabaseOperation.CLEAN_INSERT.execute(databaseTester.getConnection(), dataSet);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
@BeforeAll
static void setOracleDB() throws ClassNotFoundException {
databaseTester = new JdbcDatabaseTester(
"oracle.jdbc.driver.OracleDriver",
"jdbc:oracle:thin:@127.0.0.1:1521/xe",
"system",
"oracle",
"HR");
}
@BeforeEach
void setSeedDataEach() {
loadData("src/test/resources/seed-data-each.xml");
}
@Test
void test() {
}
}
seed-data-each.xml
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<job_history employee_id="102" start_date="2020-10-10 00:00:03" end_date="2020-11-10 00:00:04" job_id="IT_PROG" department_id="60" />
<job_history employee_id="101" start_date="2020-11-01 00:00:03" end_date="2020-12-01 00:00:04" job_id="AC_ACCOUNT" department_id="110" />
</dataset>