データベースのデータ検索・追加・更新・削除のテストを実施するDBUnitというツールで利用する@DatabaseSetupや@ExpectedDatabaseアノテーションは、JUnit5のバージョンでも利用できる。
なお、JUnit4とJUnit5の違いについては、以下のサイトを参照のこと。
https://qiita.com/torayamadajp/items/e0c84296105edb472942
今回は、JUnit5でDBUnitの@DatabaseSetupや@ExpectedDatabaseアノテーションを利用したテストを行うプログラムを作成し、JUnit4で動作するプログラムと共存させてみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の実装が完了していること。
作成したサンプルプログラムの内容
作成したサンプルプログラムの構成は以下の通り。
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。
build.gradleの内容は以下の通りで、JUnit5を利用するための設定を追加している。ちなみに、testタスク内の「useJUnitPlatform()」は、GradleでJUnit5を利用する際に必要な設定となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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のアノテーションを利用したテストクラスの内容は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | 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環境でも利用できる。