当我们有 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 list = new ArrayList(); " 如何向此列表添加值 " Mockito.when(jt.query(Mockito.anyString(), Mockito.any(RowMapper.class))).thenReturn(list);

以上是关于当我们有 rowmapper 时,如何使用 mockito 编写 junit 测试用例?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Rowmapper 对象对数据库实体进行建模

JdbcTemplate RowMapper接口

spring 中的 RowMapper

当一个托管对象在 moc A 中被删除时,它还会出现在 moc B 中吗?

如何处理主队列上的多个 moc

什么是 RowMapper、ResultSetExtractor、绑定变量和查询类型?