単体テストアシスタントはテストケースの作成時にインタフェースや複雑なオブジェクトを自動的にモックオブジェクトに変更したテストケースを作成します。
テスト対象メソッドを様々な依存関係から切り離してテストを行うことができます。
自動ではなく、任意のインタフェースやメソッドをモック化する方法は任意のオブジェクトをモック化するテストメソッドを作成を参照してください。
テストメソッド作成
Cart#getItemDB メソッドをテストするメソッドを作成します。
- ソースコードペインで Cart#getItemDB メソッドを開きます。
- 単体テストアシスタントビューで を押下します。
- 起動した画面で以下の設定を行います。※赤字が設定する値となります
テストケースの追加: 通常
初期化モード:深く
モックの初期化:テスト メソッド内で設定
作成されたテストの実行タイムアウト(ミリ秒):チェック無
テストケースを作成するメソッド: Cart.getItemDB(Connection, String) - OK ボタンを押下します。
- テストメソッドテンプレートは UTA プロジェクトの tests フォルダに作成されます。
基本的な単体テストの実施で CartTest.java を既に作成している場合、同じクラスファイル内に testGetItemDB() メソッドが追加されます。
また、テストメソッドとは別にモックを生成するためのヘルパーメソッド mockConnection(), mockResultSet(), mockStatement() が生成されます。
テストメソッド確認
TestGetItemDB() の確認
作成された testGetItemDB() を確認します。(テストメソッド名は連番で付けられるため本チュートリアルの実施順によって異なります。)@Test public void testGetItemDB() throws Exception { // テストメソッド // Given Cart underTest = new Cart(); // テストインスタンスの生成 // When // getItemDBメソッドのConnection引数のモックオブジェクト呼び出し Connection con = mockConnection(); // 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() を確認します。(一部改行を入れています。)private static Connection mockConnection() // ヘルパーメソッド throws Throwable { // Connection のモックオブジェクト生成 Connection con = mock(Connection.class); // Statement のモックヘルパーメソッド呼び出し …① Statement createStatementResult = mockStatement(); // Connection#createStatement メソッドの戻り値を設定 …② when(con.createStatement()). thenReturn(createStatementResult); return con; // onnectionを返却 }
テスト対象の getItemDB(Concection, String) メソッドの内部で Connection オブジェクトは Connection#createStatement メソッドで Statement オブジェクトの生成をします。
mockConnection() ヘルパーメソッドではテストケースの実行時に Connection#createStatement メソッドの戻り値が任意の値を戻すためのコードが自動生成されます。(上記②)
なお、Connection#createStatement メソッドの戻り値となる Statement はテストケースの生成で同時に生成された mockStatement() メソッドでモック化されています。(上記①)mockStatement() の確認
作成された mockStatement () を確認します。(一部改行を入れています。)private static Statement mockStatement () // ヘルパーメソッド throws Throwable { // Statementのモックオブジェクト生成 Statement createStatementResult = mock(Statement.class); // ResultSetのモックヘルパーメソッド呼び出し …① ResultSet executeQueryResult = mockResultSet(); // Statement# executeQueryメソッドの戻り値を設定 …② when(createStatementResult. executeQuery(nullable(String.class))). thenReturn(executeQueryResult); return createStatementResult; // Statementを返却 }
テスト対象の getItemDB(Concection, String) メソッドの内部で Statement オブジェクトは Statement#executeQuery() メソッドで ResultSet オブジェクトの生成をします。
mockStatement() ヘルパーメソッドではテストケースの実行時に Statement#executeQuery() メソッドの戻り値が任意の値を戻すためのコードが自動生成されます。(上記②)
なお、Statement#executeQuery() メソッドの戻り値となる Statement はテストケースの生成で同時に生成された mockResultSet() メソッドでモック化されています。(上記①)mockResultSet() の確認
作成された mockResultSet() を確認します。(一部改行を入れています。)private static ResultSet mockResultSet () throws Throwable { // ヘルパーメソッド // ResultSetのモックオブジェクト生成 ResultSet executeQueryResult = mock(ResultSet.class); int getIntResult = 0; // UTA: デフォルト値 // ResultSet#getIntメソッドの戻り値を設定 when(executeQueryResult.getInt(nullable(String.class))). thenReturn(getIntResult); String getStringResult = ""; // UTA: デフォルト値 // ResultSet#getString メソッドの戻り値を設定 when(executeQueryResult.getString(nullable(String.class))). thenReturn(getStringResult); // ResultSet#next メソッドの戻り値を設定 boolean nextResult = false; // UTA: デフォルト値 when(executeQueryResult.next()).thenReturn(nextResult); return executeQueryResult; // ResultSetを返却 }
テスト対象の getItemDB(Concection, String) メソッドの内部で ResultSetオブジェクトは Statement#getInt メソッド、Statement#getString メソッド、ResultSet#next メソッドの呼び出しを行います。
mockResultSet() ヘルパーメソッドではテストケースの実行時に それぞれのメソッドの戻り値が任意の値を戻すためのコードが自動生成されます。テストメソッドの変更
作成されたテストメソッドはテストの内容に合わせて変更する必要があります。
今回は、mockResultSet() で ResultSet#next メソッドの戻り値を変更します。
次のコードの false を true に変更します。変更前 boolean nextResult = false; ▼ 変更後 boolean nextResult = true;
変更後のファイルを保存し、プロジェクトのビルドが正常に行われることを確認します。
テストメソッド実行
- 単体テストアシスタントビューの をクリックします。
- 実行後、単体テストアシスタントビューの ”実行フロー“ にはモックオブジェクトの作成とモックオブジェクトを利用している個所が表示されます。
アサーション作成
ここまでに作成した testGetItemDB() メソッドにテストの成功可否を判断するためのアサーションメソッドを追加します。
- 推奨事項タブの “アサーション” で をクリックします。
- 2 つ表示される “アサーション” の作成案のうち戻り値のオブジェクト構成要素のデータをチェックするため以下の “アサーション” で をクリックします。
testGetItemDB() メソッドに以下のアサーションが追加されたことを確認します。
// 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 が発生するパターンのテストが不足していることがわかります。
例外を発生させるテストの作成でテストの実行時に例外を発生させるテストを作成します。