【问题标题】:How to write junit test case using mockito when we have rowmapper?当我们有 rowmapper 时,如何使用 mockito 编写 junit 测试用例?
【发布时间】: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测试用例?
  • 我已经发布了一种可能性作为答案。干杯,

标签: java mockito junit4


【解决方案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);
猜你喜欢
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多