我使用的是 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());
}
运行“when”会引发异常java.lang.IllegalArgumentException: RowMapper is required
,而 @MockBean 可以正常工作(而不是我想要的 SpyBean)。
为什么它适用于模拟而不适用于间谍?我应该怎么做才能使它与@Spy一起工作?
PS相同的行为
when(jdbcTemplate.query(anyString(),any(RowMapper.class)))
.thenThrow(DataAccessException.class);