0

我使用的是 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);
4

1 回答 1

1

当您使用 Spring Boot @MockBean 或 @SpyBean 时,两者都支持 Spring。

要了解 Mockito 模拟和间谍,请查看 Baeldung 的Mockito 系列,尤其是。将 Mockito 模拟注入 Spring Beans

我编写了一个使用 Mockito 和 Spring(不是 Spring Boot)的简单测试代码示例,监视真实实例,并通过 stubbing 模拟和替换方法

doNoting, doAnswer, doReturn,的用法doThrow类似,在 stubbing 行为上调用这些方法以在执行 spy 对象的方法之前返回结果。

如果您有兴趣,请查看我的 github 上关于 Mockito 的测试代码示例,例如。这个测试

于 2020-09-03T14:24:51.030 回答