S2UnitでDB削除のテスト
S2UnitによるDBのテストの最後は、削除(DELETE)。今回対象となるのは、論理削除ではなく物理削除。論理削除は、更新系の処理になるのでS2UnitでDB更新のテストを参照のこと。
今回作成したソース
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);
こんな風に書けるようにするのも悪くないかもしれない。