S2UnitでDB更新のテスト

昨日のエントリーに続き、S2Unitを使ったDBのテスト方法を見ていきたいと思います。今回は、更新(UPDATE)のテストです。

テストの考え方

  1. テスト用のデータを定義したExcel①を用意
  2. テスト結果期待値のデータを定義したExcel②を用意
  3. Excel①でDBにテスト用データをセットアップ
  4. 更新処理を実行
  5. DBの内容がExcel②と一致していることを確認

今回作成したリソース

EmployeeService.java
public void changeDepartmentId(Integer srcDepartmentId, Integer dstDepartmentId) {

    List<Employee> employeeList = jdbcManager.from(Employee.class)
                                    .where("departmentId = ?", srcDepartmentId)
                                    .getResultList();

    for (Employee employee : employeeList) {
        employee.departmentId = dstDepartmentId;
    }

    jdbcManager.updateBatch(employeeList).execute();
}

今回のテスト対象メソッド。特定の部署の社員を一気に別の部署に移すというレアなケースでの利用を想定したメソッド。

EmployeeServiceTest.java
public void test_changeDepartmentIdTx() {

    readXlsWriteDb("EmployeeServiceTestInit.xls");

    DataSet exp = readXls("EmployeeServiceTest_changeDepartmentId_Assert.xls");

    employeeService.changeDepartmentId(1, 2);

    assertEquals(exp, reload(exp));    // 期待値Excelと実際のDBの内容が一致すること
}

テストメソッド。まず検索のテストと同様、readXlsWriteDb()でテスト用データをDBにセットアップしている。その後、readXls()でテストの期待値が定義されたExcelからDataSetを取得している。そして、更新処理を実行。最後に、期待値とDBの内容が一致しているか確認している。

reload()は、主キーを元にして最新のレコードをDBから取得するメソッド。SqlReaderで同様のことができると思ったんだけど、なぜかassertEquals()で失敗してしまった。まぁ、reload()を使ったほうが簡単だからこの方法でいいのだけれど、なぜ失敗するのか気にはなる。

EmployeeServiceTest_changeDepartmentId_Assert.xls


テストの期待値を定義したExcel。変更箇所は分かりやすいように背景を黄色に。

あんまり関係ない余談

社員が特定の部署に所属するという情報を管理する方法として、社員テーブルに部署IDを保持するのはあまり良くないと言われている。所属は関係を示す1つの情報なので、所属テーブルとして抜き出したほうが良い。そうしておけば、所属の履歴を管理したいといった際に、所属テーブルに所属開始日と所属終了日のカラムを増やすだけで対応できる。