用 Spy 模拟 jdbcTemplate 查询异常(junit5)

Simulate jdbcTemplate query Exception with 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)一起工作正常。

为什么它与 mock 一起工作而不与 spy 一起工作?我应该怎么做才能让它与@Spy 一起工作?

P.S。与

相同的行为
when(jdbcTemplate.query(anyString(),any(RowMapper.class)))
        .thenThrow(DataAccessException.class);

当您使用 Spring Boot @MockBean 或 @SpyBean 时,两者都是 Spring 感知的。

要了解 Mockito mock 和 spy,请查看 Mockito series from Baeldung, esp. Injecting Mockito Mocks into Spring Beans

我已经写了 a simple testing code sample 使用 Mockito 和 Spring(不是 Spring 引导),监视真实实例,并通过存根模拟和替换方法.

doNotingdoAnswerdoReturndoThrow的用法类似,在stubbing行为上调用这些方法得到return结果再执行间谍对象的方法。

如果您有兴趣,请从我的 github 中查看有关 Mockito 的测试代码示例,例如。 this test.