読者です 読者をやめる 読者になる 読者になる

EasyMockのanyObject()で渡された値を検証する

Java

DAOとO/Rマッパーを使ったアプリにて、DAOを呼び出す方のメソッドで、呼び出したエンティティの中身も確認したい。

現状のテスト(抜粋)

public class HogeTest {
    
    /** テスト対象のクラス */
    private Hoge hoge;

    /** テスト対象のクラスが使うDAO */
    private FooDao fooDao;

    @Test
    public void testAddFoo() throws Exception {        
        IMocksControl control = createControl();
        fooDao = control.createMock(FooDao.class);

        expect(fooDao.insert(anyObject(Foo.class)).andReturn(1);        

        control.replay();

        // 内部で Foo クラスのインスタンスを作って FooDao#insert() が呼ばれる。
        int result = hoge.add("aaa", "bbb");

        // assert
        assertEquals(1, result);

        control.verify();
    }
}

上の例において、hoge.add(foo)の内部でFooオブジェクトが作られ、パラメータがセットされるものとする。
→Fooオブジェクトが作られるのはメソッドの内部のため、fooDaoの振る舞いとしては、anyObject(Foo.class)を使って、何かしらのFooオブジェクトがINSERTされること、って程度のことしか期待できなくなってしまう。
→Argument Matcherやequalsのオーバーライドといった方法は、確認したいエンティティのフィールドはテストメソッドごとにまちまちだし、エンティティの数(=テーブルの数)に比例して作るのが面倒になってしまう。
→仕方なくanyObject()を使うと、hoge.add(foo)の中で、fooの特定のパラメータのセットし忘れ、みたいなバグがあっても、上記テストはパスしてしまう。

そんなわけで、テストごとに、うまく確認する方法を考えたいと思う(続く)