山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

EasyMockでvoidメソッドの振る舞いを定義する方法。

EasyMockで普通のメソッドと同じようにvoidのメソッドの振る舞いを定義しようとしたらハマったのでメモ。(いくつか情報は出たものの、意味がわかりづらかった。)

回答

  • 普通のメソッドのように定義すると「EasyMock のメソッド expect(T) は引数 (void) に適用できません」とエラーになります。
  • よって、一度振る舞いを定義したいメソッドを呼び出した後に「expectLastCall()」を呼ぶことでその呼出を記録することができます。
  • 詳細は以下のサンプル参照。
    • 比較用にvoid以外のメソッドの振る舞いも同時に定義しています。
// テスト対象クラス
public class Hoge {
        // 返り値がString
    public String methodA() {
        return "methodA";
    }

        // 返り値がvoid
    public void methodB(String str) {
    }
}

// テストクラス
public static class HogeTest {
    @Test
    public void testMethod() throws Exception {
        Hoge hogeMock = createMock(Hoge.class);

                // 返り値がStringの場合。
        expect(hogeMock.methodA()).andReturn("mockMethodA"); 

                // 返り値がvoidの場合。
        hogeMock.methodB("str"); // 一回処理を呼び出す。
        EasyMock.expectLastCall(); // 一つ前の挙動を記録する。

        replay(hogeMock);

        assertThat(hogeMock.methodA(), is("mockMethodA"));
        hogeMock.methodB("str"); // str以外の値の場合に例外。

        verify(hogeMock);
    }
}

※上記例はEasyMock Class Extensionが入っている状態での例になります。(使用しないとインターフェースのみ。)

参考