JUnit

DBUnitでデータベースのデータ追加・更新・削除のテストを実施してみた

DBUnitというツールを利用すると、データベースのデータ検索だけでなく、データ追加・更新・削除のテストも実施できる。今回は、DBUnitにより、データ追加・更新・削除のテストを行うサンプルプログラムを作成してみたので、共有する。

前提条件

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

DBUnitでテストデータを追加後にデータ検索メソッドのテストを実施してみたDB接続に関するテストをJUnitで実施するには、DBUnitというツールを利用すると、テストメソッドを実行する前に、データを追加したり...

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

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上図の赤枠のうち、今回テスト対象となるUserDataMapperクラスのSQLファイルが「UserDataMapper.xml」で、「UserDataTestUpdate.java」がテストを行うプログラムとなる。

テスト対象となるUserDataMapperクラスのSQLファイルの内容は、以下の通り。今回はcreate, update, deleteByIdメソッドがテスト対象となる。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.UserDataMapper">
    <select id="findBySearchForm" parameterType="com.example.demo.SearchForm" 
            resultType="com.example.demo.UserData">
        SELECT u.id, u.name, u.birth_year as birthY, u.birth_month as birthM
               , u.birth_day as birthD, u.sex as sex, m.sex_value as sex_value
        FROM USER_DATA u, M_SEX m
        WHERE u.sex = m.sex_cd
        <if test="searchName != null and searchName != ''">
            AND u.name like '%' || #{searchName} || '%'
        </if>
        <if test="fromBirthYear != null and fromBirthYear != ''">
            AND #{fromBirthYear} || lpad(#{fromBirthMonth}, 2, '0') 
                  || lpad(#{fromBirthDay}, 2, '0')
               &lt;= u.birth_year || lpad(u.birth_month, 2, '0') 
                  || lpad(u.birth_day, 2, '0')
        </if>
        <if test="toBirthYear != null and toBirthYear != ''">
            AND u.birth_year || lpad(u.birth_month, 2, '0') 
                  || lpad(u.birth_day, 2, '0')
               &lt;= #{toBirthYear} || lpad(#{toBirthMonth}, 2, '0') 
                  || lpad(#{toBirthDay}, 2, '0')
        </if>
        <if test="searchSex != null and searchSex != ''">
            AND u.sex = #{searchSex}
        </if>
        ORDER BY u.id
    </select>
    <select id="findById" resultType="com.example.demo.UserData">
        SELECT u.id, u.name, u.birth_year as birthY
               , u.birth_month as birthM , u.birth_day as birthD
               , u.sex, m.sex_value as sex_value
        FROM USER_DATA u, M_SEX m
        WHERE u.sex = m.sex_cd AND u.id = #{id}
    </select>
    <delete id="deleteById" parameterType="java.lang.Long">
        DELETE FROM USER_DATA WHERE id = #{id}
    </delete>
    <insert id="create" parameterType="com.example.demo.UserData">
        INSERT INTO USER_DATA ( id, name, birth_year, birth_month, birth_day, sex )
        VALUES (#{id}, #{name}, #{birthY}, #{birthM}, #{birthD}, #{sex})
    </insert>
    <update id="update" parameterType="com.example.demo.UserData">
        UPDATE USER_DATA SET name = #{name}, birth_year = #{birthY}
            , birth_month = #{birthM}, birth_day = #{birthD}, sex = #{sex}
        WHERE id = #{id}
    </update>
    <select id="findMaxId" resultType="long">
        SELECT NVL(max(id), 0) FROM USER_DATA
    </select>
</mapper>



また、create, update, deleteByIdメソッドをテストするテストプログラムの内容は、以下の通り。

package com.example.demo;

import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.csv.CsvDataSet;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

// Spring BootのDIを利用するため、SpringRunnerクラスで、
// @SpringBootTestアノテーションを付与して実行
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDataTestUpdate extends UserDataTestBase{

    @Autowired
    private UserDataMapper userDataMapper;

    /**
     * {@inheritDoc}
     */
    @Override
    protected IDataSet getIDataSet(){
        IDataSet iDataset = null;
        try{
            iDataset = new CsvDataSet(
                    new File(System.getProperty("user.dir")
                            + "\\src\\test\\resources\\com\\example\\demo\\csv"));
        }catch (Exception e){
            System.err.println(e);
        }
        return iDataset;
    }

    /**
     * ユーザーデータへのデータ追加処理確認
     */
    @Test
    public void userDataMapperCreateTest(){
        System.out.println("*** userDataMapperCreateTest started. ***");

        // ユーザーデータへのデータ追加処理
        UserData userData = getInsertUserData();
        userDataMapper.create(userData);

        // 追加されたユーザーデータの確認
        UserData userDataInsert = userDataMapper.findById(Long.valueOf("3"));
        System.out.println("追加後の値 : " + userDataInsert.toString());
        UserData userDataExpected = getInsertUserData();
        userDataExpected.setSex_value("男");
        assertEquals(userDataExpected.toString(), userDataInsert.toString());

        System.out.println("*** userDataMapperCreateTest ended. ***");
    }

    /**
     * ユーザーデータへのデータ更新処理確認
     */
    @Test
    public void userDataMapperUpdateTest(){
        System.out.println("*** userDataMapperUpdateTest started. ***");

        // 更新用ユーザーデータの作成
        UserData userData = getUpdatedUserData();

        // ユーザーデータの更新
        userDataMapper.update(userData);

        // 更新されたユーザーデータの確認
        UserData userDataUpdate = userDataMapper.findById(Long.valueOf("1"));
        System.out.println("更新後の値 : " + userDataUpdate.toString());
        UserData userDataExpected = getUpdatedUserData();
        userDataExpected.setSex_value("女");
        assertEquals(userDataExpected.toString(), userDataUpdate.toString());

        System.out.println("*** userDataMapperUpdateTest ended. ***");
    }

    /**
     * ユーザーデータへのデータ削除処理確認
     */
    @Test
    public void userDataMapperDeleteTest(){
        System.out.println("*** userDataMapperDeleteTest started. ***");

        // ユーザーデータの削除
        userDataMapper.deleteById(Long.valueOf("2"));

        // 削除されたユーザーデータの確認
        UserData userDataDelete = userDataMapper.findById(Long.valueOf("2"));
        System.out.println("削除後ユーザーデータ : " + userDataDelete);
        assertNull(userDataDelete);

        System.out.println("*** userDataMapperDeleteTest ended. ***");
    }

    /**
     * 追加用ユーザーデータを生成
     * @return 追加用ユーザーデータ
     */
    private UserData getInsertUserData(){
        UserData userData = new UserData();
        userData.setId(3);
        userData.setName("テスト プリン3");
        userData.setBirthY(2014);
        userData.setBirthM(1);
        userData.setBirthD(15);
        userData.setSex("1");
        return userData;
    }

    /**
     * 更新用ユーザーデータを生成
     * @return 更新用ユーザーデータ
     */
    private UserData getUpdatedUserData(){
        UserData userData = new UserData();
        userData.setId(1);
        userData.setName("テスト プリン4");
        userData.setBirthY(2015);
        userData.setBirthM(2);
        userData.setBirthD(16);
        userData.setSex("2");
        return userData;
    }
}

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/junit-dbunit-updatedb/demo



作成したサンプルプログラムの実行結果

まずは、createメソッドをテストするメソッド「userDataMapperCreateTest」を実行した結果は以下の通り。
プログラム実行結果(create)

なお、テストクラスの固有のメソッドのみをテストする場合は、以下のように、テスト対象のメソッドの実行を選択する。
メソッド単位のJUnitの実行

さらに、createメソッドをテストするメソッド「userDataMapperCreateTest」を実行した後のテーブルの内容は以下の通り。下図の赤枠のデータが追加されることが確認できる。
データ追加後のDB

次に、updateメソッドをテストするメソッド「userDataMapperUpdateTest」を実行した結果は以下の通り。
プログラム実行結果(update)

また、メソッド実行後のテーブルの内容は以下の通り。下図の赤枠のデータが更新されることが確認できる。
データ更新後のDB

さらに、deleteByIdメソッドをテストするメソッド「userDataMapperDeleteTest」を実行した結果は以下の通り。
プログラム実行結果(delete)

また、メソッド実行後のテーブルの内容は以下の通り。ID=2のデータが削除されることが確認できる。
データ削除後のDB

要点まとめ

  • DBUnitというツールを利用すると、データベースのデータ検索だけでなく、データ追加・更新・削除のテストも実施できる。