我的DAO使用Spring的jdbcTemplateCreate Read Update(no Delete)操作。
jdbcTemplate
创建方法具有ID参数,该参数是表中的唯一键。
除了模拟DAO,我如何才能在不违反约束的情况下实际测试创建?
有时仍然会使用随机ID失败
我应该重写setAutoCommit以避免添加记录吗?仍然考虑有效的单元测试吗?
我必须事先在SQL中删除数据库中的记录,还是这种类型的测试有spring选项?
还是应该将其视为集成测试而不是单元测试?
编辑
我使用的是Oracle,无法使用序列创建ID的值
我们在生产中存在一些数据源(不用于测试)
这实际上取决于这种测试的目的是什么,就这一点而言,并非所有测试都是“单元测试”。
例如,如果目标是测试封装业务逻辑的“服务”,但是有时从该服务中调用DAO,则最好的方法可能就是按照您的建议模拟DAO。在这种情况下,此测试显然不会涵盖DAO,但是该服务将涵盖。
如果目的是测试SQL语句(并且我假设DAO除了SQL语句+可能将它们转换为域对象,则不包含任何内容),则不能选择模拟。
在这种情况下,测试应该包括对某种数据库的调用,但是在这种情况下,它不再称为单元测试(单元测试是一种运行速度非常快的东西,它仅在内存中,没有DB,没有I / O,等)(我也将其称为集成测试),但是对于这种测试,不同的人可能会有不同的名字。
实际上,我们需要两种测试,因为它们测试的是不同的东西
那么,如何测试呢?
首先应该做出决定,应该使用哪个数据库,这里有3种方法:
尽管关于哪种方法更好的讨论本身非常有趣,但对于IMO这个问题而言,却超出了讨论范围,每个选择都有其含义。
完成此决定后,您应该从代码中决定如何使用此数据库。
通常,弹簧测试使用以下模式:
因此,如果您对所有测试都遵循这种方法,那么它们将从“空”数据状态开始,这样就不会出现约束冲突。这也有效地解决了“删除记录”问题,因为无论何时事务处理,数据都会被删除回滚。
现在关于事务外记录的删除。
一种明显的方法是直接在测试中(在DAO外部)执行删除的sql,以便DAO(不会更改生产代码)
您可以将DataSource / JDBCTemplate直接注入测试中(Spring测试完全支持此操作),然后从那里调用所需的SQL