比較バージョン

キー

  • この行は追加されました。
  • この行は削除されました。
  • 書式設定が変更されました。

単体テストアシスタントはテストケースの作成時にインタフェースや複雑なオブジェクトを自動的にモックオブジェクトに変更したテストケースを作成します。
テスト対象メソッドを様々な依存関係から切り離してテストを行うことができます。

自動ではなく、任意のインタフェースやメソッドをモック化する方法は『任意のオブジェクトをモック化するテストメソッドを作成』を参照してください。

・テストメソッド作成

Cart#getItemDB メソッドをテストするメソッドを作成します。1.

  1. ソースコードペインで Cart#getItemDB メソッドを開きます。

    Image Modified

...


  1. 単体テストアシスタントビューで Image Modifiedを押下します。

...


  1. 起動した画面で以下の設定を行います。※赤字が設定する値となります

...


  1. テストケースの追加: 通常

...

  1. 初期化モード:深く

...

  1. モックの初期化:テスト メソッド内で設定

...

  1. 作成されたテストの実行タイムアウト(ミリ秒)チェック無

...

  1. テストケースを作成するメソッド: Cart.getItemDB(Connection, String)

    Image Modified

...


  1. OK ボタンを押下します。

...


  1. テストメソッドテンプレートは UTA プロジェクトの tests フォルダに作成されます。
    基本的な単体テストの実施」で CartTest.java を既に作成している場合、同じクラスファイル内に testGetItemDB() メソッドが追加されます。
     また、テストメソッドとは別にモックを生成するためのヘルパーメソッド mockConnection(), mockResultSet(), mockStatement() が生成されます。

...


  1. Image Added

・テストメソッド確認

...

  1. TestGetItemDB() の確認
    作成された testGetItemDB() を確認します。(テストメソッド名は連番で付けられるため本チュートリアルの実施順によって異なります。)

...

  1. コード ブロック
    themeEclipse
    @Test
    public void testGetItemDB() throws Exception {

...

  1.   // テストメソッド
    	// Given

...

  1. 
    	Cart underTest = new Cart();

...

  1.   // テストインスタンスの生成
    
    	//

...

  1.  When
    	// getItemDBメソッドのConnection引数のモックオブジェクト呼び出し
    	Connection con = mockConnection();

...

  1. 		
    	// getItemDBメソッドのString引数
    	String itemId = ""; // UTA:

...

  1.  デフォルト値
    	Item result = underTest.getItemDB(con, itemId);

...

  1. 		// getItemDB メソッドの呼び出し

...

  1. 
    
    	//

...

  1.  Then
    	// assertNotNull(result);

...

  1. 		// getItemDB の戻り値のチェック用アサーションテンプレート
    }

    テンプレート作成時に getItemDB(Connection, String) メソッドの引数となるString オブジェクトにはデフォルト値 “” が格納されます。
    同じく引数のConnection オブジェクトは同一テストクラス内に生成された Connection のモックを生成・設定するためのヘルパーメソッド mockConnection() の戻り値が格納されます。

...


  1. mockConnection() の確認
    作成された mockConnection() を確認します。(一部改行を入れています。)

    コード ブロック
    themeEclipse
    private static Connection mockConnection()

...

  1.  		// ヘルパーメソッド
    		throws Throwable {
    	// Connection のモックオブジェクト生成
    	Connection con = mock(Connection.class);

...

Statement createStatementResult = mockStatement();

...

  1. 
    
    	// Statement のモックヘルパーメソッド呼び出し …①	
    	Statement createStatementResult = mockStatement();	
    
    	// Connection#createStatement メソッドの戻り値を設定 …②	
    	when(con.createStatement()).

...

  1. 							
    		thenReturn(createStatementResult);

...

  1. 
    	return con;		// onnectionを返却
    }

    テスト対象の getItemDB(Concection, String) メソッドの内部で Connection オブジェクトは Connection#createStatement メソッドで Statement オブジェクトの生成をします。
    mockConnection() ヘルパーメソッドではテストケースの実行時に Connection#createStatement メソッドの戻り値が任意の値を戻すためのコードが自動生成されます。(上記②)
    なお、Connection#createStatement メソッドの戻り値となる Statement はテストケースの生成で同時に生成された mockStatement() メソッドでモック化されています。(上記①)

...


  1. mockStatement() の確認
    作成された mockStatement () を確認します。(一部改行を入れています。)

    コード ブロック
    themeEclipse
    private static Statement mockStatement ()

...

  1.  		// ヘルパーメソッド
    		throws Throwable {
    	// Statementのモックオブジェクト生成
    	Statement createStatementResult = mock(Statement.class);

...

  1. 
    
    	// ResultSetのモックヘルパーメソッド呼び出し …①		
    	ResultSet executeQueryResult = mockResultSet();	
    
    	// Statement# executeQueryメソッドの戻り値を設定 …②	
    	when(createStatementResult.

...

  1. 			
    		executeQuery(nullable(String.class))).

...

  1. 
    		thenReturn(executeQueryResult);

...

return createStatementResult;

...

  1. 
    	return createStatementResult;		// Statementを返却
    }

    テスト対象の getItemDB(Concection, String) メソッドの内部で Statement オブジェクトは Statement#executeQuery() メソッドで ResultSet オブジェクトの生成をします。
    mockStatement() ヘルパーメソッドではテストケースの実行時に Statement#executeQuery() メソッドの戻り値が任意の値を戻すためのコードが自動生成されます。(上記②)
    なお、Statement#executeQuery() メソッドの戻り値となる Statement はテストケースの生成で同時に生成された mockResultSet() メソッドでモック化されています。(上記①)

...


  1. mockResultSet() の確認
    作成された mockResultSet() を確認します。(一部改行を入れています。)

    コード ブロック
    themeEclipse
    private static ResultSet mockResultSet () throws Throwable {

...

  1. 		// ヘルパーメソッド
    
    	// ResultSetのモックオブジェクト生成
    	ResultSet executeQueryResult = mock(ResultSet.class);

...

  1. 		
    	int getIntResult = 0; // UTA:

...

  1.  デフォルト値
    
    	// ResultSet#getIntメソッドの戻り値を設定
    	when(executeQueryResult.getInt(nullable(String.class))).

...

  1. 		
    		thenReturn(getIntResult);

...

  1. 
    	String getStringResult = ""; // UTA:

...

  1.  デフォルト値
    
    	// ResultSet#getString メソッドの戻り値を設定
    	when(executeQueryResult.getString(nullable(String.class))).

...

  1. 		
    		thenReturn(getStringResult);

...

boolean nextResult = false; // UTA: デフォルト値

  1. 
    
    	// ResultSet#next メソッドの戻り値を設定
    	boolean nextResult = false; // UTA: デフォルト値		
    	when(executeQueryResult.next()).thenReturn(nextResult);

...

  1. 
    	return executeQueryResult;			// ResultSetを返却
    }

    テスト対象の getItemDB(Concection, String) メソッドの内部で ResultSetオブジェクトは Statement#getInt メソッド、Statement#getString メソッド、ResultSet#next メソッドの呼び出しを行います。
    mockResultSet() ヘルパーメソッドではテストケースの実行時に それぞれのメソッドの戻り値が任意の値を戻すためのコードが自動生成されます。


  2. テストメソッドの変更
    作成されたテストメソッドはテストの内容に合わせて変更する必要があります。
    今回は、mockResultSet() ResultSet#next メソッドの戻り値を変更します。
    次のコードの falsetrue に変更します。

...

  1. コード ブロック
    themeEclipse
    変更前									変更後
    boolean nextResult = false;		⇒		boolean nextResult = true;

    変更後のファイルを保存し、プロジェクトのビルドが正常に行われることを確認します。

・テストメソッド実行

...

  1. 単体テストアシスタントビューの Image Modifiedをクリックします。

...

  1. 実行後、単体テストアシスタントビューの ”実行フロー“ にはモックオブジェクトの作成とモックオブジェクトを利用している個所が表示されます。

    Image Modified

・アサーション作成

ここまでに作成した testGetItemDB() メソッドにテストの成功可否を判断するためのアサーションメソッドを追加します。1.

  1. 推奨事項タブの アサーションImage Modifiedをクリックします。

...

  1. つ表示される アサーションの作成案のうち戻り値のオブジェクト構成要素のデータをチェックするため以下の アサーション Image Modifiedをクリックします。

    Image Modified

  2. 3.testGetItemDB() メソッドに以下のアサーションが追加されたことを確認します。

    コード ブロック
    themeEclipse
    // Then - メソッド getItemDB(Connection, String) の結果 のアサーション

...

  1. 
    assertNotNull(result);

...

  1. 
    assertEquals("", result.getName());

...

  1. 
    assertEquals("", result.getId());

...

  1. 
    assertEquals(0, result.getPrice());

...

  1. 
    assertEquals(0, result.getCount());

...


  1. 変更後の testGetItemDB() メソッドを Image Modifiedから実行します。

...


  1. 実行後、カバレッジビューでCart#getItemDB の実行行を確認します。

    Image Modified

    カバレッジビュー上は Cart#getItemDB メソッドの 92 % が実行されていることがわかります。
    ソースコードペインの横に表示される赤のライン情報から java.sql.SQLException が発生するパターンのテストが不足していることがわかります。
    例外を発生させるテストの作成」でテストの実行時に例外を発生させるテストを作成します。