単体テストアシスタントはテストケースの作成時にインタフェースや複雑なオブジェクトを自動的にモックオブジェクトに変更したテストケースを作成します。
テスト対象メソッドを様々な依存関係から切り離してテストを行うことができます。
...
「基本的な単体テストの実施」で CartTest.java を既に作成している場合、同じクラスファイル内に testGetItemDB() メソッドが追加されます。
また、テストメソッドとは別にモックを生成するためのヘルパーメソッド mockConnection(), mockResultSet(), mockStatement() が生成されます。
・テストメソッド確認
...
TestGetItemDB() の確認
作成された testGetItemDB() を確認します。(テストメソッド名は連番で付けられるため本チュートリアルの実施順によって異なります。)
...
コード ブロック theme Eclipse @Test public void testGetItemDB() throws Exception {
...
// テストメソッド // Given
...
Cart underTest = new Cart();
...
// テストインスタンスの生成 // When
...
Connection con = mockConnection();
...
// getItemDBメソッドのConnection引数のモックオブジェクト呼び出し // getItemDBメソッドのString引数 String itemId = ""; // UTA:
...
デフォルト値 Item result = underTest.getItemDB(con, itemId);
...
// getItemDB メソッドの呼び出し
...
//
...
Then // assertNotNull(result);
...
// getItemDB の戻り値のチェック用アサーションテンプレート }
テンプレート作成時に getItemDB(Connection, String) メソッドの引数となるString オブジェクトにはデフォルト値 “” が格納されます。
同じく引数のConnection オブジェクトは同一テストクラス内に生成された Connection のモックを生成・設定するためのヘルパーメソッド mockConnection() の戻り値が格納されます。
...
mockConnection() の確認
作成された mockConnection() を確認します。(一部改行を入れています。)コード ブロック theme Eclipse private static Connection mockConnection()
...
// ヘルパーメソッド throws Throwable { Connection con = mock(Connection.class);
...
// Connection のモックオブジェクト生成
...
Statement createStatementResult = mockStatement();
...
// Statement のモックヘルパーメソッド呼び出し …①
...
when(con.createStatement()).
...
// Connection#createStatement メソッドの戻り値を設定 …② thenReturn(createStatementResult);
...
return con; // onnectionを返却 }
テスト対象の getItemDB(Concection, String) メソッドの内部で Connection オブジェクトは Connection#createStatement メソッドで Statement オブジェクトの生成をします。
mockConnection() ヘルパーメソッドではテストケースの実行時に Connection#createStatement メソッドの戻り値が任意の値を戻すためのコードが自動生成されます。(上記②)
なお、Connection#createStatement メソッドの戻り値となる Statement はテストケースの生成で同時に生成された mockStatement() メソッドでモック化されています。(上記①)
...
mockStatement() の確認
作成された mockStatement () を確認します。(一部改行を入れています。)コード ブロック theme Eclipse private static Statement mockStatement ()
...
// ヘルパーメソッド throws Throwable { Statement createStatementResult = mock(Statement.class
...
); // Statementのモックオブジェクト生成 ResultSet executeQueryResult = mockResultSet(); // ResultSetのモックヘルパーメソッド呼び出し …① when(createStatementResult.
...
// Statement# executeQueryメソッドの戻り値を設定 …② executeQuery(nullable(String.class))).
...
thenReturn(executeQueryResult);
...
return createStatementResult;
...
return createStatementResult; // Statementを返却 }
テスト対象の getItemDB(Concection, String) メソッドの内部で Statement オブジェクトは Statement#executeQuery() メソッドで ResultSet オブジェクトの生成をします。
mockStatement() ヘルパーメソッドではテストケースの実行時に Statement#executeQuery() メソッドの戻り値が任意の値を戻すためのコードが自動生成されます。(上記②)
なお、Statement#executeQuery() メソッドの戻り値となる Statement はテストケースの生成で同時に生成された mockResultSet() メソッドでモック化されています。(上記①)
...
mockResultSet() の確認
作成された mockResultSet() を確認します。(一部改行を入れています。)コード ブロック theme Eclipse private static ResultSet mockResultSet () throws Throwable {
...
// ヘルパーメソッド ResultSet executeQueryResult = mock(ResultSet.class);
...
// ResultSetのモックオブジェクト生成 int getIntResult = 0; // UTA: デフォルト値 when(executeQueryResult.getInt(nullable(String.class))).
...
// ResultSet#getIntメソッドの戻り値を設定 thenReturn(getIntResult);
...
String getStringResult = ""; // UTA: デフォルト値
...
when(executeQueryResult.getString(nullable(String.class))).
...
// ResultSet#getString メソッドの戻り値を設定 thenReturn(getStringResult);
...
boolean nextResult = false; // UTA:
...
デフォルト値 // ResultSet#next メソッドの戻り値を設定 when(executeQueryResult.next()).thenReturn(nextResult);
...
return executeQueryResult; // ResultSetを返却 }
テスト対象の getItemDB(Concection, String) メソッドの内部で ResultSetオブジェクトは Statement#getInt メソッド、Statement#getString メソッド、ResultSet#next メソッドの呼び出しを行います。
mockResultSet() ヘルパーメソッドではテストケースの実行時に それぞれのメソッドの戻り値が任意の値を戻すためのコードが自動生成されます。テストメソッドの変更
作成されたテストメソッドはテストの内容に合わせて変更する必要があります。
今回は、mockResultSet() で ResultSet#next メソッドの戻り値を変更します。
次のコードの false を true に変更します。コード ブロック theme Eclipse 変更前
...
変更後 boolean nextResult = false; ⇒ boolean nextResult = true;
変更後のファイルを保存し、プロジェクトのビルドが正常に行われることを確認します。
・テストメソッド実行
...
- 単体テストアシスタントビューの をクリックします。
...
- 実行後、単体テストアシスタントビューの ”実行フロー“ にはモックオブジェクトの作成とモックオブジェクトを利用している個所が表示されます。
・アサーション作成
ここまでに作成した testGetItemDB() メソッドにテストの成功可否を判断するためのアサーションメソッドを追加します。1.
- 推奨事項タブの “アサーション” で をクリックします。
...
- つ表示される “アサーション” の作成案のうち戻り値のオブジェクト構成要素のデータをチェックするため以下の “アサーション” で をクリックします。
3.testGetItemDB() メソッドに以下のアサーションが追加されたことを確認します。
コード ブロック theme Eclipse // Then - メソッド getItemDB(Connection, String) の結果 のアサーション
...
assertNotNull(result);
...
assertEquals("", result.getName());
...
assertEquals("", result.getId());
...
assertEquals(0, result.getPrice());
...
assertEquals(0, result.getCount());
...
- 変更後の testGetItemDB() メソッドを から実行します。
...
- 実行後、カバレッジビューでCart#getItemDB の実行行を確認します。
カバレッジビュー上は Cart#getItemDB メソッドの 92 % が実行されていることがわかります。
ソースコードペインの横に表示される赤のライン情報から java.sql.SQLException が発生するパターンのテストが不足していることがわかります。
「例外を発生させるテストの作成」でテストの実行時に例外を発生させるテストを作成します。