Я использую 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);