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というツールを利用すると、データベースのデータ検索だけでなく、データ追加・更新・削除のテストも実施できる。





