春天DA有助于写作的DAO。 当使用iBATIS作为持久性框架,并延伸SqlMapClientDaoSupport,一个SqlMapClient的模拟应当对DAO进行设置,但我不能这样做。 的SqlMapClientTemplate不是接口和EasyMock的不能为它创建一个模拟。
Answer 1:
DAO和单元测试不相处得很好! 这是没有意义的嘲笑在不持有任何业务逻辑和专注于数据库访问组件任何东西。 你应该尝试,而不是写一个集成测试。 看看春季参考文档,第8.3章: http://static.springframework.org/spring/docs/2.5.x/reference/testing.html
Answer 2:
这确切的原因就是我为什么不从延伸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);
}
}
Answer 3:
作为@Banengusk建议-这可以实现的Mockito 。 然而,要建立你的DAO将使用一个Spring是很重要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"));
Answer 4:
尝试的Mockito 。 它可以让模拟类,不仅接口。
文章来源: How to unit test a DAO that is extending SqlMapClientDaoSupport