繁体   English   中英

Mockito:mocking 包含 lambda 表达式的方法调用

[英]Mockito: mocking a method call that contains a lambda expression

我正在为以下 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 框架服务 class 的一部分; 单元测试通过 SpringJUnit4ClassRunner 运行。

我使用 Mockito 来模拟 jdbcTemplate object(类型为 NamedParameterJdbcTemplate)。

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

query(String sql, RowMapper<T> rowMapper)

我试过这个:

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

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

Mockito object 肯定被注入到 class 中。

打印模拟的调用会显示:

[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);

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

@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;
}

现在可以了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM