Имитация исключения запроса jdbcTemplate с помощью Spy (junit5)

Я использую Spy, а не Mock, потому что мне нужна обычная функциональность в других методах. Я хочу имитировать исключение при вызове запроса jdbcTemplate.

Прототип JdbcTemplate.query — public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException, и я называю его так:

jdbcTemplate.query("select 1 from dual", new SingleColumnRowMapper<>());

Вот моя шпионская декалькация:

@SpyBean
JdbcTemplate jdbcTemplate;

А вот и тест:

@Test
void testDbIsDown() {
    when(jdbcTemplate.query(anyString(),any(SingleColumnRowMapper.class)))
            .thenThrow(new DataAccessResourceFailureException("s"));
    Health health = dbServiceValidator.health();
    assertThat(health.getStatus().getCode())
            .isEqualTo(Health.down().build().getStatus().getCode());
}

Запуск «когда» выдает исключение java.lang.IllegalArgumentException: RowMapper is required Хотя он отлично работает с @MockBean (вместо SpyBean, который мне нужен).

Почему это работает с макетом, но не со шпионом? Что мне сделать, чтобы он работал с @Spy?

P.S. Такое же поведение с

when(jdbcTemplate.query(anyString(),any(RowMapper.class)))
        .thenThrow(DataAccessException.class);

person AsfK    schedule 03.09.2020    source источник
comment
См. этот пост, надеюсь, он будет полезен.   -  person Hantsy    schedule 03.09.2020
comment
@Hantsy Спасибо! После прочтения я понимаю, что на самом деле я не выбрасываю исключение с макетом, просто ничего не делаю. Итак, на самом деле мне нужно понять, как издеваться над JdbcTemplate.query.   -  person AsfK    schedule 03.09.2020


Ответы (1)


Когда вы используете Spring Boot @MockBean или @SpyBean, оба поддерживают Spring.

Чтобы понять Mockito mock and spy, ознакомьтесь с серией Mockito от Baeldung, особенно. Внедрение макетов Mockito в Spring Beans.

Я написал простой пример тестового кода с использованием Mockito и Spring (не Spring Boot), следите за реальным экземпляром, имитируйте и заменяйте методы заглушками.

Использование doNoting, doAnswer, doReturn, doThrow аналогично, вызывайте эти методы в заглушках, чтобы вернуть результат перед выполнением метода объекта-шпиона.

Если вам интересно, проверьте образцы кода тестирования Mockito на моем github, например. этот тест.

person Hantsy    schedule 03.09.2020