如何对扩展SqlMapClientDaoSupport的DAO进行unit testing

Spring DA有助于编写DAO。 当使用iBATIS作为持久性框架并扩展SqlMapClientDaoSupport时,应该为DAO设置SqlMapClient模拟,但我不能这样做。 SqlMapClientTemplate不是一个接口,EasyMock不能为它创建一个模拟。

DAO和unit testing不太顺利! 在没有任何业务逻辑的组件中模拟任何东西并且专注于数据库访问是没有意义的。 您应该尝试编写集成测试。 查看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 SqlMapClient 。 事实上, SqlMapClientTemplate将调用委托给SqlMapSession层中的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); 

然后我们可以validation这样的行为:

 Entity entity = new EntityImpl(4, "someField"); dao.save(entity); ArgumentCaptor 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 。 它允许模拟类,而不仅仅是接口。