Spring DA は、DAO の作成に役立ちます。永続化フレームワークとして iBATIS を使用し、SqlMapClientDaoSupport を拡張する場合、DAO に SqlMapClient モックを設定する必要がありますが、それができません。SqlMapClientTemplate はインターフェースではなく、EasyMock はそのモックを作成できません。
4 に答える
@Banenguskが示唆したように、これはMockitoで実現できます。ただし、DAOがSqlMapClientTemplate
モックをラップするスプリングを使用することを確認することが重要SqlMapClient
です。実際、SqlMapClientTemplate
呼び出しをSqlMapSession
IBatisレイヤーのに委任します。
したがって、いくつかの追加のモックセットアップが必要です。
mockSqlMapSession = mock(SqlMapSession.class);
mockDataSource = mock(DataSource.class);
mockSqlMapClient = mock(SqlMapClient.class);
when(mockSqlMapClient.openSession()).thenReturn(mockSqlMapSession);
when(mockSqlMapClient.getDataSource()).thenReturn(mockDataSource);
dao = new MyDao();
dao.setSqlMapClient(mockSqlMapClient);
次に、次のような動作を確認できます。
Entity entity = new EntityImpl(4, "someField");
dao.save(entity);
ArgumentCaptor<Map> params = ArgumentCaptor.forClass(Map.class);
verify(mockSqlMapSession).insert(eq("insertEntity"), params.capture());
assertEquals(3, params.getValue().size());
assertEquals(Integer.valueOf(4), params.getValue().get("id"));
assertEquals("someField", params.getValue().get("name"));
assertNull(params.getValue().get("message"));
この正確な理由は、私がから拡張しない理由ですSqlMapClientDaoSupport
。SqlMapClientTemplate
代わりに、 ( interface として型指定された)への依存関係を注入しますSqlMapClientOperations
。Spring 2.5 の例を次に示します。
@Component
public class MyDaoImpl implements MyDao {
@Autowired
public SqlMapClientOperations template;
public void myDaoMethod(BigInteger id) {
int rowcount = template.update("ibatisOperationName", id);
}
}
DAO と単体テストは相性が悪い! ビジネス ロジックを保持せず、データベース アクセスに重点を置いているコンポーネントで何かをモックしても意味がありません。代わりに、統合テストを作成してみてください。スプリング リファレンス ドキュメントの 8.3 章を見てください: http://static.springframework.org/spring/docs/2.5.x/reference/testing.html
モッキートを試してみてください。インターフェイスだけでなく、クラスをモックできます。