Javaの結合テストとは?Model・DAO・データベースの連携を確認する方法|確認問題の回答例
Javaの結合テストとは?Model・DAO・データベースの連携を確認する方法の確認問題の回答例です。戻り値、DBの状態、テストする範囲を分けて考えましょう。
問題1:戻り値だけでは保存内容を確認できない
戻り値1だけで合格にはできません。今回の事前条件は空のテーブルなので、DBをSELECTし、「資料を確認する」という値の行が1行存在し、余計な2行目がないことを確認します。
assertTrue(rs.next());
assertEquals("資料を確認する", rs.getString("title"));
assertFalse(rs.next());
これは本文のSELECTを実行したResultSetに対する確認部分です。1行目の存在、保存値、2行目がないことを順に確かめています。件数1を返すだけでDBに保存しない実装や、違う文字列を保存する不具合を、戻り値のテストだけでは見つけられません。
問題2:別々のテストに、別々の空のDBを用意する
本文の例では、staticではない@TempDirフィールドと@BeforeEachを使い、テストメソッドごとに別の一時フォルダへDBを作り、空のtasksテーブルから開始します。TC01の結果をTC02へ引き継がず、実行順序が変わっても同じ条件で確認できます。
普段使うDBや本番DBを消して空にすることではありません。既存データを使う仕様のテストなら、そのケースが必要とする行をテスト専用DBへ用意し、実行前後を比較します。
問題3:例外が通知されても、保存されていたら不合格
仕様に合っていません。「不正な入力は通知して保存しない」が要件なので、IllegalArgumentExceptionの通知と、DBの行数が0のままであることを両方確認します。登録してから入力を検証する実装では、例外だけを見ても不具合を見逃します。
本文ではSELECT COUNT(*) AS totalの結果をnextで読み、assertEquals(0, rs.getInt(“total”))で確認しています。これはDBが変わっていないことの確認であり、DAOが一度も呼ばれなかったことそのものを証明する確認ではありません。
問題4:ServletやJSPなど、通していない範囲を確認する
例として、フォーム・Servlet間の受け渡しと、Servlet・JSP間の受け渡しを挙げられます。
- HTMLのnameとgetParameterの引数が一致し、意図したURL・HTTPメソッドでServletに値が届くか。
- Servletが意図したModelを呼び、正しい入力値とDBの接続先を渡しているか。
- setAttributeとgetAttributeの属性名、forward先が一致し、JSPが結果を正しく表示するか。
今回のテストでは、テストコードからModelを直接呼んでいます。合格した範囲を根拠に調査を絞りつつ、実際のアプリとテストでDBの場所などが異なる点も確認します。テストが通っただけで「DAOやDBには絶対に問題がない」とは断定できません。