测试与Mockito一起使用JDBC的DAO类

时间:2016-01-11 12:30:52

标签: java mysql spring jdbc

我正在尝试使用DAO classMockito进行单元测试。我之前已经编写了一些单元测试,但没有使用某些数据库(在这种情况下为DAO classJDBCMySQl

我决定从这个简单的方法开始,但我现在不是哪些好的做法,我不知道如何开始。

我不知道在这种情况下这是否很重要,但该项目正在使用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);
    }
}

1 个答案:

答案 0 :(得分:2)

如果你真的想测试DAO,那就创建一个内存数据库。使用期望值填充它,在DAO中执行查询并检查数据库中先前插入的值的结果是否正确。

模拟ConnectionResultSetPreparedStatement太重,结果不符合预期,因为您无法访问真正的数据库。

注意:使用这种方法你的内存数据库应该与你的phisical数据库有相同的方言,所以不要使用最终数据库的特定函数或语法,而是尝试遵循SQL标准。

如果您使用内存数据库,则“mocking”整个数据库。因此结果测试不是真正的单元测试,但也不是集成测试。如果您喜欢这种方法,请使用DBUnit之类的工具轻松配置和填充数据库。

考虑模拟数据库类(PreparedStatementStatementResultSetConnection)是一个漫长的过程,并且不会因为它按预期工作而被授予,因为你没有通过sql引擎测试sql的正确格式。

你也可以看一下article of Lasse Koskela谈论单元测试的问题。

要测试DAO,您需要:

  • 清空数据库(内存数据库中不需要)
  • 使用数据示例填充数据库(使用db unit自动,使用@BeforeClass@Before方法完成)
  • 运行测试(使用JUnit)

如果您希望将实际单元测试与集成测试正式分开,可以将DAO测试移到单独的目录中,并在需要时和集成测试中对其进行测试。

具有不同兼容模式的内存数据库中H2具有以下数据库兼容性:

  • IBM DB2
  • Apache Derb
  • HSQLDB
  • MS SQL Server
  • MySQL的
  • 甲骨文
  • 的PostgreSQL