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の特定のパラメータのセットし忘れ、みたいなバグがあっても、上記テストはパスしてしまう。
そんなわけで、テストごとに、うまく確認する方法を考えたいと思う(続く)