JUnit

JUnit5でDBUnitの@DatabaseSetupや@ExpectedDatabaseというアノテーションを利用してみた

データベースのデータ検索・追加・更新・削除のテストを実施するDBUnitというツールで利用する@DatabaseSetupや@ExpectedDatabaseアノテーションは、JUnit5のバージョンでも利用できる。

なお、JUnit4とJUnit5の違いについては、以下のサイトを参照のこと。
https://qiita.com/torayamadajp/items/e0c84296105edb472942

今回は、JUnit5でDBUnitの@DatabaseSetupや@ExpectedDatabaseアノテーションを利用したテストを行うプログラムを作成し、JUnit4で動作するプログラムと共存させてみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

JUnit4でDBUnitの@DatabaseSetupや@ExpectedDatabaseというアノテーションを利用してみたDBUnitというツールを利用すると、データベースのデータ検索・追加・更新・削除のテストを実施できるが、その際、テスト前にテストデータを...

作成したサンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。

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



ウズウズカレッジJavaコースはわかりやすい動画教材と充実した就業サポートで優良企業を目指せるプログラミングスクールだったJavaは、世界中で広く使われていて、現在の需要が高く将来性もある開発言語になります。 https://www.acrovision....

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) テスト実行前のデータは、以下の通り。
サンプルプログラムの実行結果_1

2) UserDataTestJunit5クラスを実行した時のログ出力内容は以下の通りで、@DatabaseSetupアノテーションでテスト前にテストデータを設定し、@ExpectedDatabaseアノテーションでテスト後のデータ検証が行えていることが確認できる。
サンプルプログラムの実行結果_2_1

サンプルプログラムの実行結果_2_2

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

なお、今回は掲載していないが、UserDataTest1クラス・UserDataTest2クラスについても、前提条件の記事と同じように実行できる。

要点まとめ

  • DBUnitというツールを利用してDB回りのテストを行う際に利用する、@DatabaseSetupや@ExpectedDatabaseアノテーションは、JUnit5環境でも利用できる。