S2UnitでDB削除のテスト

S2UnitによるDBのテストの最後は、削除(DELETE)。今回対象となるのは、論理削除ではなく物理削除。論理削除は、更新系の処理になるのでS2UnitでDB更新のテストを参照のこと。

テストの考え方

  1. テスト用のデータを定義したExcelを用意
  2. ExcelからDBにテスト用データをセットアップ
  3. 削除処理を実行
  4. 削除されたはずのレコードを主キーで取得し、取得できないことを確認

今回作成したソース

EmployeeService.java
public void deleteByEmployeeId(Integer employeeId) {

    Employee entity = jdbcManager.from(Employee.class).where("employeeId = ?", employeeId).getSingleResult();

    jdbcManager.delete(entity).execute();
}

テスト対象のメソッド。引数で主キーを受け取り、それをキーにレコードを削除している。

EmployeeServiceTest.java
public void test_deleteByEmployeeIdTx() {

    readXlsWriteDb("EmployeeServiceTestInit.xls");

    employeeService.deleteByEmployeeId(1);

    Employee entity = jdbcManager.from(Employee.class).where("employeeId = ?", 1).getSingleResult();

    assertNull(entity);    // レコードは削除されたはずなので、nullが取得されること
}

テストメソッド。まず、readXlsWriteDb()でDBにテストデータをセットアップした後、テスト対象のメソッドを呼び出している。その後、S2JDBC(jdbcManager)を使用して、削除されたはずのレコードを主キーを元に取得している。そして、その結果がnullであることを確認してテスト終了。

補足

今回のケースでは1件削除するだけであったが、複数のテーブルのレコードを一気に削除するケースも多いと思う(ユーザが退会して〜とか)。そうした場合は、テストコードが冗長になるので、privateなショートカットメソッドを用意して、読みやすくしておくのも手かもしれない。私はテストコードもリファクタリングすべきだと思っている。

assertNull(getEmployeeById(1));
assertNull(getEmployeeById(2));
assertNull(getEmployeeById(3));

assertNull(getDepartmentById(1));
assertNull(getDepartmentById(2));

あるいは、もっと進めて

String[] assertDelete = { "Employee:1,2,3", "Department:1,2" };
assertDeleteRecord(assertDelete);

こんな風に書けるようにするのも悪くないかもしれない。

S2UnitでのDBテストを終えて

今回で、S2Unitを使用したDBのテストは終わりです。Excelからテスト用データをDBにセットアップしたり、自動ロールバック機能があったりと、S2UnitはDBの単体テストをかなり楽にしてくれると思いました。

DBもリファクタリングが行われるこのご時世。DBの単体テスト自動化も「当たり前」になる時代は既に訪れているのかもしれません。