如何对扩展SqlMapClientDaoSupport的DAO进行单元测试
题
Spring DA有助于编写DAO。当使用iBATIS作为持久性框架并扩展SqlMapClientDaoSupport时,应该为DAO设置SqlMapClient模拟,但我不能这样做。 SqlMapClientTemplate不是一个接口,EasyMock不能为它创建一个模拟。
解决方案
DAO和单元测试相处不好! 在没有任何业务逻辑并且专注于数据库访问的组件中模拟任何东西都没有意义。 您应该尝试编写集成测试。请参阅Spring参考文档,第8.3章: http: //static.springframework.org/spring/docs/2.5.x/reference/testing.html
其他提示
这正是为什么我不从 SqlMapClientDaoSupport
扩展的原因。相反,我将依赖注入 SqlMapClientTemplate
(键入为 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);
}
}
正如@Banengusk建议的那样 - 可以通过 Mockito 来实现。但是,重要的是确定您的DAO将使用包装模拟 SqlMapClient
的Spring SqlMapClientTemplate
。事实上, SqlMapClientTemplate
将调用委托给IBatis层中的 SqlMapSession
。
因此需要一些额外的模拟设置:
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"));
尝试 Mockito 。它允许模拟类,而不仅仅是接口。
不隶属于 StackOverflow