【问题标题】:Test DAO class which is using JDBC with Mockito测试使用 JDBC 和 Mockito 的 DAO 类
【发布时间】:2016-01-11 12:30:52
【问题描述】:

我正在尝试使用MockitoDAO class 进行单元测试。我之前写过一些单元测试,但不是在DAO class 上使用一些数据库(在本例中为JDBCMySQl)。

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

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

【问题讨论】:

  • 其实如果你实现了服务部分,除了在webservice项目上使用之外,你还可以想出一种新的方法来测试服务,现在代码显示了spring jdbc dao对象,这并不意味着与你的测试相关的任何事情环境?
  • @Sabir Khan 我从来没有在 DAO 类上写过单元测试。我尝试使用 HSQLDB 进行测试,但之后我意识到它不是单元测试而是集成。我在这里要求一些提示和一些简单的例子。

标签: java mysql spring jdbc


【解决方案1】:

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

模拟ConnectionResultSetPreparedStatement 太重了,结果不如预期,因为你没有访问真正的数据库。

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


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

考虑到模拟数据库类(PreparedStatementStatementResultSetConnection)是一个漫长的过程,并且您无法按预期工作,因为您没有测试正确的格式你的 sql 在 sql 引擎上。

您还可以查看 article of Lasse Koskela 谈论单元测试 daos。


要测试 DAO,您需要:

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

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


具有不同兼容模式的内存数据库可能是H2,具有以下数据库兼容性:

  • IBM DB2
  • 阿帕奇德布
  • HSQLDB
  • MS SQL 服务器
  • MySQL
  • 甲骨文
  • PostgreSQL

【讨论】:

  • 如果我使用内存数据库,测试将不是集成?
  • 我在答案中添加了我的 cmets
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 2021-03-21
  • 2015-04-07
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
相关资源
最近更新 更多