spring - spock,在 spring bean 中模拟方法响应
问题描述
我在 Spring Boot 应用程序中有一个用 groovy (spock) 编写的集成测试。其中一个应用程序 bean 被称为Validator
它具有以下方法:
public void validateIssueDates(final List<Timestamp> issueDates) {
issueDates.forEach(issueDate -> {
final Timestamp now = Timestamp.valueOf(LocalDateTime.now());
if (issueDate.before(now)) {
throw new IllegalArgumentException("Issue date is before current date");
}
});
}
在Validator
类中还有其他方法。在我的spock
集成测试中,我只想模拟该特定方法的响应。通过以下方式:
Validator.validateIssueDates(_) >> null
我希望进行其他验证,但不是这个。基本上我想用 spock来实现这一点。我想消除该validateIssueDates()
方法的执行
解决方案
解决方案使用Spock
它是使用 [@SpringSpy][2] 完成的。
首先,我们用要包装在 spy 对象中的 spring bean 来注释字段。例如:
@SpringSpy
private CarValidator carValidator;
然后在我们的测试中,then
我们部分定义了我们希望如何覆盖来自 aa bean/spy 的方法:
then:
3 * carValidator.validateIssueDates(_) >> null
解决方案使用Mockito
(作为一种附加方法,它与 spock 解决方案无关)
我已经很容易spy
在Mockito
. spock
尽管's进行了许多试验(和错误)spy
,但它只是不想工作。如果我明白了,我把它贴在这里。目前,我只能分享Mockito
解决方案:
@Profile("test")
@Configuration
public class BeanConfig {
@Bean
@Primary
public CarValidator getCarValidatorSpy(CarValidator validator) {
CarValidator carValidatorSpy = Mockito.spy(validator);
Mockito.doNothing().when(carValidatorSpy).validateIssueDates(Mockito.any(CarDto.class));
return carValidatorSpy;
}
}
就这样。看起来相当简单。
推荐阅读
- yocto - 如何使用 Yocto 修改 rootfs 配置文件?
- node.js - SequelizeDatabaseError:列“functionCode”不存在,当它存在时
- javascript - 在 Vue.js 中更改 DIV 网格上的背景颜色而不更改其他人的背景
- dart - 如何在 Dart 构造函数中设置 final/const 属性
- python-3.x - 在哪里放置经过训练的语音模型
- ios - 表格视图动态单元格内的文本视图会产生奇怪的滚动行为
- python - 如何确保 TensorFlow Generator 上采样过程创建完全覆盖随机噪声的种子?
- javascript - Firestore:重复 firestore.set() 导致错误:索引 0 处的元素不应为空字符串
- linux - Linux/Shell 对大文本文件进行切片
- c++ - 我们如何在c中制作函数指针的深层副本