我们正在使用MyBatis(3.0.5)作为我们的or-mapping工具(我没有任何发言权!)。
我创建了一个Response
对象,通过MyBatis映射到我们的[responses]
数据库表(我们使用PostgreSQL)。
实际上,我们使用的ormapping结构如下:
ResponseDAO
方法的ResponseMapper
的具体实现;我们使用Spring将此类的实例注入到我们的应用程序中因此,要将新的[responses]
记录插入到PostgreSQL中,代码在调用组件中看起来像这样:
@Autowired
private ResponseDAO response;
public void doStuff()
{
int action = getAction();
response.setAction(action);
response.insert();
}
这个设置对我们很有效。但是我现在正在尝试为ResponseDAOImpl
类编写一组JUnit测试,我想确保它正确地对PostgreSQL数据库执行查询。
据我所知,没有办法“模拟”整个数据库。因此,我唯一的选择(看似)是让测试方法执行查询,检查是否成功,然后再将其回滚。
MyBatis似乎不支持这种回滚功能。我在Old Nabble的mybatis-user
邮件列表中发现了this,但海报上使用的是Guice,他/她的问题似乎更多是关于通过Guice回滚交易。
如果MyBatis 不支持支持事务/回滚(是吗?!?!),那么看起来我的唯一重做就是PostgreSQL-JDBC驱动程序支持这些。我想我可以尝试配置我的测试方法,以便它们运行ResponseDAO.insert()
方法,然后手动尝试直接通过驱动程序回滚事务(没有MyBatis)。
SO有这方面的经验吗?代码示例?提示?最佳做法?提前谢谢!
答案 0 :(得分:0)
不确定这是否是您所需要的,但org.apache.ibatis.session.SqlSession类具有可用于回滚的rollback()方法。
另一种方法是使用来自同一个类的getConnection()方法,该方法将返回javax.sql.Connection javax.sql.Connection类,该类也有commit()和rollback()方法。
希望它有所帮助。 Remis B
答案 1 :(得分:0)
MyBatis在使用“SqlSession”时允许回滚,你可以使用spring依赖注入片,它会在方法完成时自动提交你的事务。
你有几个选择,其中
注入依赖项的模拟。有一些摇摆的图书馆可以帮助解决这个问题。与Mockito,here is a good question on Spring Mockito stuff一样。这将测试您的java中的业务逻辑,而不是您的实际查询。
提交查询,并在测试运行后删除您的数据。这是我们采用的方法,因为它也测试了我们的数据库。你显然需要一个数据库的测试实例,而有些人却没有。
您可以尝试为在MyBatis Spring Integration中执行自动提交的类提供自己的测试绑定,并覆盖那些行为,以便在测试环境中行为是回滚查询而不是提交。在Guice集成中使用了类似的方法,并对其进行了描述here。