簡體   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