关于java:Mockito:模拟包含lambda表达式的方法调用

Mockito: mocking a method call that contains a lambda expression

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

1
2
3
4
5
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类中模拟此方法:

1
query(String sql, RowMapper< T > rowMapper)

我已经尝试过了:

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

...但是当我运行单元测试时,在传递了代码行之后," list "变量始终为null,就像没有触发模拟返回我的值一样。 >

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

打印模拟的语音将显示以下内容:

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

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


我将模拟的配置移动到了创建的位置:

1
2
3
4
5
6
7
8
9
10
11
12
@Bean(name ="jdbcTemplate")
public NamedParameterJdbcTemplate jdbcTemplate() {
    NamedParameterJdbcTemplate jdbcTemplate = Mockito.mock(NamedParameterJdbcTemplate.class);

    Pair<String, String> pair = new Pair<String, String>(CODE, NAME);
    List<Pair<String, String>> pairList = new ArrayList<Pair<String, String>>();
    pairList.add(pair);

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

    return jdbcTemplate;
}

现在可以使用。


尝试Mockito.any(Function.class)

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