Mockito: насмешливый вызов метода, который содержит лямбда-выражение - PullRequest
3 голосов
/ 08 апреля 2020

Я создаю модульный тест для приведенного ниже кода Java, который получает данные из базы данных и, через лямбду, отображает полученные данные в список:

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 Framework сервисный класс; модульный тест запускается через 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» всегда равна нулю после прохождения строки кода, как если бы mock не был запущен для возврата моего значения.

Объект Mockito определенно вводится в класс.

Печать вызовов макета отображает это:

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

Есть что-то, что я явно делаю неправильно? Заранее благодарим за любую помощь.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Я переместил конфигурацию макета туда, где он был создан:

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

Теперь это работает.

0 голосов
/ 08 апреля 2020

попробуй Mockito.any(Function.class)

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