JUnit + EasyMock(2)

EasyMock は以下の流れに沿って使用されます。

  1. モックオブジェクトの生成
  2. 操作の記録
  3. テスト対象のクラスから利用
  4. 検証


1.モックオブジェクトの生成

MockControl mockControl = MockControl.createControl( IBar.class );// (1)
IBar mock = (IBar)mockControl.getMock();

インタフェースを指定して、MockControl.createControl( Class ) を呼び出します( (1)の部分 )。
これにより、モックオブジェクトに対応した MockControl オブジェクトが取得されます。
モックオブジェクトは MockControl オブジェクトの getMock() メソッドを利用して取得できます。


2.操作の記録

String arg1 = "ロボキッス";
String arg2 = "( ・∀・)イイ!";
int barFunc1Result = 100;
int barFunc2Result = 200;

// barFunc1 と barFunc2 の呼び出しを期待し、その戻り値を設定
mock.barFunc1( arg1 );
mockControl.setReturnValue( barFunc1Result );// (2)
mock.barFunc2( arg2 );
mockControl.setReturnValue( barFunc2Result );

mockControl.replay();// (3)

生成直後のモックオブジェクトは記録モードで動作しています。
記録モードの時はそのモックオブジェクトに対するメソッド呼び出しと戻り値の設定を記録します。
テスト対象のクラスからの想定される呼び出しと、期待する戻り値を設定します。
上記例の場合、barFunc1 と barFunc2 がそれぞれ引数に arg1 と arg2 を受けとって呼び出されることを設定しています。
また、モックオブジェクトのメソッド呼び出しに続いて MockControl オブジェクトの setReturnValue *1を呼び出すことで、直前のメソッド呼び出しにおける戻り値を設定します( (2)の部分 )。

メソッド呼び出しの記録が終わったら、MockControl オブジェクトの replay() メソッドを使用して再生モードにします( (3)の部分 )。
再生モードになったモックオブジェクトのメソッドを呼び出すと、記録モード時に設定された戻り値が返されます。


3.テスト対象のクラスから利用

target.setBar( mock );
    :
    :
int actualResult = target.fooFunc( arg1, arg2 );
int expectedResult = barFunc1Result + barFunc2Result;
assertEquals( "Foo#fooFunc 戻り値", expectedResult, actualResult );

あとは普通にテスト対象のクラスに組み込んで使用します。テスト対象のクラスに設定するのはどのタイミングでも問題ありません。*2
テスト対象のメソッドがモックオブジェクトのメソッドを呼び出せば、記録モード時に設定した戻り値が取得されます。
また、このときモックオブジェクトのメソッドに渡される引数のチェックも行なわれます。異なる引数が渡された場合はエラーとなります。

4.検証

mockControl.verify();// (5)

呼び出されることが期待されているメソッドがすべて呼び出されているか等をチェックします。呼び出されていない場合はエラーとなります。
また、期待されていないメソッドが呼び出された場合や、呼び出し回数が異なる等の場合はモックオブジェクトのメソッドが呼び出されたタイミングでエラーとなります。

*1:expectAndReturn メソッドを使用してもよいです。1行で記述を済ませることができるので、見やすくなります。

*2:無論、テスト対象のクラスがセッタメソッド内でモックのメソッドを呼び出さない限りはですが。