データベースのデータ検索・追加・更新・削除のテストを実施するDBUnitというツールで利用する@DatabaseSetupや@ExpectedDatabaseアノテーションは、JUnit5のバージョンでも利用できる。
なお、JUnit4とJUnit5の違いについては、以下のサイトを参照のこと。
https://qiita.com/torayamadajp/items/e0c84296105edb472942
今回は、JUnit5でDBUnitの@DatabaseSetupや@ExpectedDatabaseアノテーションを利用したテストを行うプログラムを作成し、JUnit4で動作するプログラムと共存させてみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の実装が完了していること。
作成したサンプルプログラムの内容
作成したサンプルプログラムの構成は以下の通り。

なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。
build.gradleの内容は以下の通りで、JUnit5を利用するための設定を追加している。ちなみに、testタスク内の「useJUnitPlatform()」は、GradleでJUnit5を利用する際に必要な設定となる。
plugins {
id 'org.springframework.boot' version '2.1.7.RELEASE'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
compileOnly 'org.projectlombok:lombok:1.18.10'
annotationProcessor 'org.projectlombok:lombok:1.18.10'
compile files('lib/ojdbc6.jar')
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1'
// DBUnitについての設定を追加
testCompile group: 'org.dbunit', name: 'dbunit', version: '2.6.0'
testCompile group: 'com.github.springtestdbunit', name: 'spring-test-dbunit', version: '1.3.0'
// MyBatisのテストを行うための設定を追加
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.1.3'
// JUnit5を利用するための設定を追加
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.3.2'
testImplementation group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.3.2'
testImplementation group: 'org.junit.vintage', name: 'junit-vintage-engine', version: '5.3.2'
}
// JUnit5を利用するための設定を追加
test {
useJUnitPlatform()
}また、JUnit5ベースで、@DatabaseSetupと@ExpectedDatabaseのアノテーションを利用したテストクラスの内容は、以下の通り。
package com.example.demo.mapper;
import com.github.springtestdbunit.DbUnitTestExecutionListener;
import com.github.springtestdbunit.TransactionDbUnitTestExecutionListener;
import com.github.springtestdbunit.annotation.DatabaseSetup;
import com.github.springtestdbunit.annotation.DbUnitConfiguration;
import com.github.springtestdbunit.annotation.ExpectedDatabase;
import com.github.springtestdbunit.assertion.DatabaseAssertionMode;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.boot.test.autoconfigure.MybatisTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
// JUnit5ベースでMyBatisのテストを実行する
@MybatisTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class
, DirtiesContextTestExecutionListener.class
, TransactionDbUnitTestExecutionListener.class
, DbUnitTestExecutionListener.class})
@DbUnitConfiguration(dataSetLoader = DemoXlsDataSetLoader.class
, databaseConnection = {"dbUnitDatabaseConnection"})
public class UserDataTestJunit5 {
/**
* ユーザーデータテーブル(user_data)へアクセスするマッパー
*/
@Autowired
private UserDataMapper userDataMapper;
/**
* 各テストメソッドを実行する前に行う処理を定義する.
*/
@BeforeEach
public void beforeTest() {
System.out.println();
System.out.println("*** UserDataTestJunit5クラス テスト結果 start ***");
}
/**
* テストを実行する前に、databaseSetupTest.xlsxに定義したデータを読み込み、
* 取得したデータを検証する.
*/
@Test
@DatabaseSetup("/com/example/demo/xls/databaseSetupTest.xlsx")
public void userDataTest() {
System.out.println("*** userDataTestメソッド テスト結果 start ***");
// @DatabaseSetupアノテーションで設定されたデータを確認
System.out.println("*** ユーザーデータテーブル(user_data)のデータ ***");
List<UserData> userDataList = userDataMapper.findAll();
for (UserData userData : userDataList) {
System.out.println(userData);
}
assertEquals(expectedUserDataList(), userDataList);
System.out.println("*** userDataTestメソッド テスト結果 end ***");
}
/**
* テストを実行した後で、expectedDatabaseTest.xlsxに定義したデータが
* 追加されることを検証する.
*/
@Test
@DatabaseSetup("/com/example/demo/xls/databaseSetupTest.xlsx")
@ExpectedDatabase(value="/com/example/demo/xls/expectedDatabaseTest.xlsx"
, assertionMode = DatabaseAssertionMode.NON_STRICT_UNORDERED)
public void userDataTes2() {
System.out.println("*** userDataTest2メソッド テスト結果 start ***");
UserData userDataAdd = new UserData(4, "テスト プリン4"
, 2016, 5, 6, "1", "テスト4", "男");
userDataMapper.create(userDataAdd);
System.out.println("*** ユーザーデータテーブル(user_data)のデータ ***");
List<UserData> userDataList = userDataMapper.findAll();
for (UserData userData : userDataList) {
System.out.println(userData);
}
System.out.println("*** userDataTest2メソッド テスト結果 end ***");
}
/**
* 予想されるテスト結果のデータを定義する.
* @return 予想されるテスト結果のデータ
*/
private List<UserData> expectedUserDataList() {
List<UserData> userDataList = new ArrayList<>();
UserData userData1 = new UserData(1, "テスト プリン1"
, 2012, 2, 10, "1", null, "男");
UserData userData2 = new UserData(2, "テスト プリン2"
, 2013, 3, 15, "2", null, "女");
UserData userData3 = new UserData(3, "テスト プリン3"
, 2015, 4, 21, "2", "テスト3", "女");
userDataList.add(userData1);
userDataList.add(userData2);
userDataList.add(userData3);
return userDataList;
}
/**
* 各テストメソッドを実行した後に行う処理を定義する.
*/
@AfterEach
public void afterTestClass() {
System.out.println("*** UserDataTestJunit5クラス テスト結果 end ***");
System.out.println();
}
}その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/junit5-dbunit-annotation/demo
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
2) UserDataTestJunit5クラスを実行した時のログ出力内容は以下の通りで、@DatabaseSetupアノテーションでテスト前にテストデータを設定し、@ExpectedDatabaseアノテーションでテスト後のデータ検証が行えていることが確認できる。


3) テスト実行後のデータは、以下の通りで、実際のDBデータは更新されずロールバックされることが確認できる。

なお、今回は掲載していないが、UserDataTest1クラス・UserDataTest2クラスについても、前提条件の記事と同じように実行できる。
要点まとめ
- DBUnitというツールを利用してDB回りのテストを行う際に利用する、@DatabaseSetupや@ExpectedDatabaseアノテーションは、JUnit5環境でも利用できる。






