DAO(Repository)の単体テストについて

DbSetUpとAssertj-DBの組み合わせがとても良さそうです。

さらに組み込みDBのH2と組み合わせてSpringのTest系の機能を組み合わせるとほぼ理想通りのDAOのテストがかけるようになりました。

具体的には以下が実現出来ています。

  1. h2でテスト実行するからMySQLなどの本物のDBが要らない
  2. テスト実行後のデータが残るのでテスト失敗時のデータが残せる
  3. テストクラスごとにh2のデータベースが起動するので、テストの並列実行が可能(=高速化)
  4. テストデータを簡単に投入できる
  5. データを簡単に検証できる

コードの完全版は用意できませんでしたが、DbSetUpとAssertj-DBの簡単なサンプルを示しておきます。

DBのセットアップはこんな感じで、

@Before
public void setUp() {
    Operation ops = sequenceOf(DELETE_ALL, INSERT_ROLE);
    DbSetup dbSetup = new DbSetup(this.destination, ops);
    dbSetup.launch();
}

テーブルの中身の検証はこんな感じです。

Assertions.assertThat(someTable)
          .hasNumberOfRows(5)
          .row(0)
          .value("some_column").isEqualTo("awesomeValue")
          .value("other_column").isEqualTo("fantastic");

量が多くなると流石に見づらくなりますが、JavaでDBのテストを表現できると書きやすくていいですね。

この組み合わせは実際に業務で利用しています。