JUnit + EasyMock(3)

昨日のテストケースを EasyMock を使用して書き換えると以下のような感じになります。
(大きく異なる部分は赤文字で表示しています)

public class BarTest extends TestCase {
  private Foo target;
  private IBar barMock;
  private MockControl mockControl
  protected void setUp() {
    target = new Foo();
    mockControl = MockControl.createControl( IBar.class );
    barMock = mockControl.getMock();
    target.setBar( barMock );
  }

  public void testFooFuncMethod() throws Exception {
    // モックオブジェクトの設定
    int barFunc1Result = 100;
    int barFunc2Result = 200;
    String arg1 = "ののタン";
    String arg2 = "(*´д`*)ハァハァ";
    
    barMock.func1( arg1 );
    mockControl.setReturnValue( barFunc1Result );
    barMock.func2( arg2 );
    mockControl.setReturnValue( barFunc2Result );
    mockControl.replay();
    
    // テスト対象メソッドの呼び出し
    int actualResult = target.fooFunc( arg1, arg2 );
    
    // 検証
    int expectedResult = barFunc1Result + barFunc2Result;
    assertEquals( "Foo#fooFunc 戻り値", expectedResult, actualResult );
  }
}

モックオブジェクトの設定部分が多少慣れないかもしれませんが、一度理解してしまえば非常に楽にモックオブジェクトを使用したテストを行なうことが出来ます。
蛇足ですが、メソッド呼び出しの設定部分ですが、expectAndReturn メソッドを利用すれば短く記述できます。
こんな感じです。

    mockControl.expectAndReturn( barMock.func1( arg1 ), barFunc1Result );
    mockControl.expectAndReturn( barMock.func2( arg2 ), barFunc2Result );
    mockControl.replay();


今日はこんなところ。あとは様様なケースでの使い方をピンポイントで紹介と、equals メソッドが実装されていないオブジェクトが引数として渡された場合の引数チェックの有効な方法の紹介ぐらいです。

  • メソッド呼び出しで例外を送出する設定(setThrowable,expectAndThrow)
  • メソッドの呼び出し回数設定(Range,ONE,ONE_OR_MORE,ZERO_OR_MORE)
  • 厳密なコントロール(createStrictControl)と、ナイスなコントロール(createNiceControl)
  • 引数のチェック(ArgumentsMatcher)
  • モックオブジェクトの再使用(reset)