【发布时间】:2020-09-03 12:01:25
【问题描述】:
我使用的是 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)一起正常工作。
为什么它可以使用 mock 而不是 spy?我应该怎么做才能使其与@Spy 一起使用?
附:与
相同的行为when(jdbcTemplate.query(anyString(),any(RowMapper.class)))
.thenThrow(DataAccessException.class);
【问题讨论】:
-
看到这个post,希望对你有帮助。
-
@Hantsy 谢谢!阅读后我明白我真的不会用模拟抛出异常,只是什么都不做。所以实际上我需要了解如何模拟 JdbcTemplate.query。
标签: java spring-boot jdbctemplate spy junit-jupiter