Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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

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

テストメソッド作成

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

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

    Image Modified

  2. 単体テストアシスタントビューで

    Image Removedを押下します。

    「+テストスイートの作成」を押下します。

  3. テストケースの追加: 通常
    初期化モード:深く

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



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


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


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

    Image RemovedImage Added
  4. OK ボタンを押下します。

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

    Image Modified

テストメソッド確認

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

    Eclipse
    Code Block
    theme
    @Test
    	public void testGetItemDB() throws ExceptionThrowable {   // テストメソッド
    		// Given
    		Cart underTest = new Cart();           // テストインスタンスの生成
    
    		// When
    		// getItemDBメソッドのConnection引数のモックオブジェクト呼び出し
    		Connection con = mockConnection();	
    	
    	// getItemDBメソッドのString引数
    		String itemId = "itemId"; // UTA: デフォルト値
    		Item result = underTest.getItemDB(con, itemId);		       // getItemDB メソッドの呼び出し
    
    		// Then - メソッド getItemDB(Connection, String) の結果 のアサーション
    	// 	assertNotNull(result);		// getItemDB の戻り値のチェック用アサーションテンプレート
    }

    テンプレート作成時に getItemDB(Connection, String)

    メソッドの引数となるString

    メソッドの引数となるString オブジェクトにはデフォルト値

    “”

    “itemId” が格納されます。

    同じく引数のConnection

    同じく引数のConnection オブジェクトは同一テストクラス内に生成された Connection のモックを生成・設定するためのヘルパーメソッド mockConnection() の戻り値が格納されます。

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

    Eclipse
    Code Block
    theme
    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

    なお、Connection#createStatement メソッドの戻り値となる Statement はテストケースの生成で同時に生成された mockStatement() メソッドでモック化されています。(上記①)

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

    Eclipse
    Code Block
    theme
    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#executeQuery() メソッドの戻り値となる Statement はテストケースの生成で同時に生成された mockResultSet() メソッドでモック化されています。(

    上記①

    上記①)

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

    Eclipse
    Code Block
    theme
    private static ResultSet mockResultSet () throws Throwable {		// ヘルパーメソッド
    
    	// ResultSetのモックオブジェクト生成
    	ResultSet executeQueryResult = mock(ResultSet.class);		
    	intboolean getIntResultnextResult = 0false; // UTA: デフォルト値指定された値
    
    	// ResultSet#getIntメソッドの戻り値を設定
    	when(executeQueryResult.getInt(nullable(String.class))).		
    		thenReturn(getIntResult);
    	String getStringResult = "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 ResultSetオブジェクトは Statement#getInt メソッド、Statement#getString メソッド、ResultSet#next メソッドの呼び出しを行います。
    mockResultSet() ヘルパーメソッドではテストケースの実行時に それぞれのメソッドの戻り値が任意の値を戻すためのコードが自動生成されます。


  5. テストメソッドの変更
    作成されたテストメソッドはテストの内容に合わせて変更する必要があります。

    今回は、mockResultSet

    今回は、mockResultSet() ResultSet#next メソッドの戻り値を変更します。
    次のコードの falsetrue に変更します。

    Eclipse
    Code Block
    theme
    変更前						
    boolean nextResult = false;		
    
    ▼
    
    変更後
    boolean nextResult = true;

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

テストメソッド実行

  1. 単体テストアシスタントビューの

    Image Removedをクリックします。

    「+testGetItemDBの実行」をクリックします。

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

    Image RemovedImage Added

アサーション作成

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

  1. 推奨事項タブの

    アサーションImage Removedをクリックします。

    “アサーション” で 「+getItemDBのトラック」をクリックします。

  2. 2 つ表示される

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

    “アサーション” の作成案のうち戻り値のオブジェクト構成要素のデータをチェックするため以下の “アサーション” で 「アサーションの作成」をクリックします。

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

    Eclipse
    Code Block
    theme
    // Then - メソッド getItemDB(Connection, String) の結果 のアサーション
    assertNotNull(result);
    assertEquals("", result.getName());
    assertEquals("", result.getId());
    assertEquals(0, result.getPrice());
    assertEquals(0, result.getCount());

  4. 変更後の testGetItemDB() メソッドを

    Image Removedから実行します。

    「+testGetItemDBの実行」から実行します。

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

    Image Modified


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