我正在为下面的Java代码创建单元测试,该Java代码从数据库获取数据,并通过lambda将检索到的数据映射到列表中:

List<Pair<String, String>> list = jdbcTemplate.query(MY_QUERY, (rs, rowNum) -> {
    String code = rs.getString(1);
    String name = rs.getString(2);
    return new Pair<String, String>(code, name);
});


它是Spring框架服务类的一部分;单元测试通过SpringJUnit4ClassRunner运行。

我已使用Mockito模拟jdbcTemplate对象(类型为NamedParameterJdbcTemplate)。

我正在尝试模拟jdbcTemplate的结果。查看方法调用,看来我需要在NamedParameterJdbcTemplate类中模拟此方法:

query(String sql, RowMapper<T> rowMapper)


我已经试过了:

List<Pair<String, String>> pairList = ...;
Mockito.when(jdbcTemplate.query(Mockito.anyString(), Mockito.any(RowMapper.class))).thenReturn(pairList);


...但是当我运行单元测试时,通过代码行之后,“ list”变量始终为null,就好像没有触发模拟返回我的值一样。

Mockito对象肯定被注入到类中。

打印模拟的命令将显示以下内容:

[Mockito] Interactions of: Mock for NamedParameterJdbcTemplate, hashCode: <n>
1. namedParameterJdbcTemplate.query("query", my.package.MyClass$$Lambda$114/1274225913@3e134896);


我明显在做错什么吗?在此先感谢您的协助。

最佳答案

尝试Mockito.any(Function.class)

Mockito.when(jdbcTemplate.query(Mockito.anyString(), Mockito.any(Function.class))).thenReturn(pairList);

关于java - Mockito:模拟包含lambda表达式的方法调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61091353/

10-11 22:16
查看更多