使用spy模拟jdbctemplate查询异常(junit5)

ltqd579y  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(377)

我使用的是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一起工作?
p、 我们的行为和

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

kq0g1dla1#

当您使用springboot@mockbean或@spybean时,两者都是spring感知的。
要了解mockito mock和spy,请查看baeldung的mockito系列,特别是将mockito mock注入springbean。
我已经编写了一个简单的测试代码示例,使用mockito和spring(不是spring boot),监视真实示例,并通过stubing模拟和替换方法。
使用 doNoting , doAnswer , doReturn , doThrow 类似的,在执行spy对象的方法之前,对stubing行为调用这些方法以返回结果。
如果您感兴趣,请查看我的github中有关mockito的测试代码示例,例如this test。

相关问题