当我们有 rowmapper 时,如何使用 mockito 编写 junit 测试用例?
Posted
技术标签:
【中文标题】当我们有 rowmapper 时,如何使用 mockito 编写 junit 测试用例?【英文标题】:How to write junit test case using mockito when we have rowmapper? 【发布时间】:2022-01-07 09:05:20 【问题描述】:如何使用 mockito 为这段代码编写 junit 测试用例?
List<Employee> employee = jdbctemplate.query("select * from employee", new RowMapper<Employee>()
@Override
public Employee mapRow(ResultSet rs, int rownumber) throws SQLException
Employee e = new Employee();
e.setId(rs.getString("ID"));
e.setName(rs.getString("NAME"));
return e;
);
【问题讨论】:
什么是“这段代码”?它只是行映射器,还是带有 SQL 语句的整个 JDBC 查询? 那么你最好使用一个使用真实数据库或轻量级内存数据库(例如 hsql)的 集成测试。 如果它只是行映射器那么如何为此编写junit测试用例? 我已经发布了一种可能性作为答案。干杯, 【参考方案1】:将按以下方式构建行映射器的单元测试:
模拟 JDBC 结果集, 模拟结果集的“get”方法以返回相关列的特定值, 调用行映射器, 测试结果实体的值。代码可能类似于以下:
// Having:
final var resultSet = mock(ResultSet.class);
when(resultSet.getString("ID")).thenReturn("4711");
when(resultSet.getString("Name")).thenReturn("John Doe");
// When:
final var employee = myRowMapper.mapRow(resultSet, 12345);
// Then:
assertEquals("4711", employee.getId());
assertEquals("John Doe", employee.getName());
【讨论】:
这是唯一的方法还是我们可以使用任何其他方法? 几乎总是有很多方法可以解决同一个问题 :) 你有什么具体要求? 以上代码中的“myRowMapper”是什么? 这是正在测试的行映射器。如果只测试行映射器,则需要将其提取到一个单独的辅助函数类中。 JdbcTemplate jt = Mockito.mock(JdbcTemplate.class); List以上是关于当我们有 rowmapper 时,如何使用 mockito 编写 junit 测试用例?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Rowmapper 对象对数据库实体进行建模