DBUnitというツールを利用すると、データベースのデータ検索だけでなく、データ追加・更新・削除のテストも実施できる。今回は、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') <= 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メソッドをテストするテストプログラムの内容は、以下の通り。
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というツールを利用すると、データベースのデータ検索だけでなく、データ追加・更新・削除のテストも実施できる。