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

作成したサンプルプログラムの内容
作成したサンプルプログラムの構成は以下の通り。
なお、上図の赤枠のうち、今回テスト対象となるUserDataMapperクラスのSQLファイルが「UserDataMapper.xml」で、「UserDataTestUpdate.java」がテストを行うプログラムとなる。
テスト対象となるUserDataMapperクラスのSQLファイルの内容は、以下の通り。今回はcreate, update, deleteByIdメソッドがテスト対象となる。
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 | <?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') <= 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') <= #{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メソッドをテストするテストプログラムの内容は、以下の通り。
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 121 122 123 124 125 126 127 128 129 130 | 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メソッドをテストするメソッド「userDataMapperCreateTest」を実行した後のテーブルの内容は以下の通り。下図の赤枠のデータが追加されることが確認できる。
次に、updateメソッドをテストするメソッド「userDataMapperUpdateTest」を実行した結果は以下の通り。
また、メソッド実行後のテーブルの内容は以下の通り。下図の赤枠のデータが更新されることが確認できる。
さらに、deleteByIdメソッドをテストするメソッド「userDataMapperDeleteTest」を実行した結果は以下の通り。
また、メソッド実行後のテーブルの内容は以下の通り。ID=2のデータが削除されることが確認できる。
要点まとめ
- DBUnitというツールを利用すると、データベースのデータ検索だけでなく、データ追加・更新・削除のテストも実施できる。