【问题标题】:Mockito: mocking a method call that contains a lambda expressionMockito:模拟包含 lambda 表达式的方法调用
【发布时间】:2020-04-08 00:05:14
【问题描述】:

我正在为以下 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类中mock这个方法:

query(String sql, RowMapper<T> rowMapper)

我试过这个:

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

...但是当我运行单元测试时,“list”变量在这行代码通过后总是为空,好像没有触发mock返回我的值。

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

打印模拟的调用会显示:

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

有什么我明显做错了吗?提前感谢您的帮助。

【问题讨论】:

    标签: java spring unit-testing mockito


    【解决方案1】:

    试试Mockito.any(Function.class)

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

    【讨论】:

    • 不编译:“NamedParameterJdbcTemplate 类型中的方法 query(String, ResultSetExtractor) 不适用于参数 (String, Mockito.any(Function.class))”。我也尝试过 Mockito.any(ResultSetExtractor.class) 并且在编译时,列表仍然是空的。
    【解决方案2】:

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

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

    现在可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 2014-06-21
      • 2020-07-30
      相关资源
      最近更新 更多