DAO(Repository)の単体テストについて
DbSetUpとAssertj-DBの組み合わせがとても良さそうです。
さらに組み込みDBのH2と組み合わせてSpringのTest系の機能を組み合わせるとほぼ理想通りのDAOのテストがかけるようになりました。
具体的には以下が実現出来ています。
- h2でテスト実行するからMySQLなどの本物のDBが要らない
- テスト実行後のデータが残るのでテスト失敗時のデータが残せる
- テストクラスごとにh2のデータベースが起動するので、テストの並列実行が可能(=高速化)
- テストデータを簡単に投入できる
- データを簡単に検証できる
コードの完全版は用意できませんでしたが、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のテストを表現できると書きやすくていいですね。
この組み合わせは実際に業務で利用しています。