我正在尝试使用DAO class
对Mockito
进行单元测试。我之前已经编写了一些单元测试,但没有使用某些数据库(在这种情况下为DAO class
和JDBC
)MySQl
。
我决定从这个简单的方法开始,但我现在不是哪些好的做法,我不知道如何开始。
我不知道在这种情况下这是否很重要,但该项目正在使用Spring Framework
。
public class UserProfilesDao extends JdbcDaoSupport {
@Autowired
private MessageSourceAccessor msa;
public long getUserId(long userId, int serviceId) {
String sql = msa.getMessage("sql.select.service_user_id");
Object[] params = new Object[] { userId, serviceId };
int[] types = new int[] { Types.INTEGER, Types.INTEGER };
return getJdbcTemplate().queryForLong(sql, params, types);
}
}
答案 0 :(得分:2)
如果你真的想测试DAO,那就创建一个内存数据库。使用期望值填充它,在DAO中执行查询并检查数据库中先前插入的值的结果是否正确。
模拟Connection
,ResultSet
,PreparedStatement
太重,结果不符合预期,因为您无法访问真正的数据库。
注意:使用这种方法你的内存数据库应该与你的phisical数据库有相同的方言,所以不要使用最终数据库的特定函数或语法,而是尝试遵循SQL标准。
如果您使用内存数据库,则“mocking”整个数据库。因此结果测试不是真正的单元测试,但也不是集成测试。如果您喜欢这种方法,请使用DBUnit之类的工具轻松配置和填充数据库。
考虑模拟数据库类(PreparedStatement
,Statement
,ResultSet
,Connection
)是一个漫长的过程,并且不会因为它按预期工作而被授予,因为你没有通过sql引擎测试sql的正确格式。
你也可以看一下article of Lasse Koskela谈论单元测试的问题。
要测试DAO,您需要:
@BeforeClass
或@Before
方法完成)如果您希望将实际单元测试与集成测试正式分开,可以将DAO测试移到单独的目录中,并在需要时和集成测试中对其进行测试。
具有不同兼容模式的内存数据库中H2具有以下数据库兼容性: