spock,模拟 spring bean 中的方法响应
spock, mock a method response in a spring bean
我在 spring 启动应用程序中用 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
class中还有其他方法。在我的 spock
集成测试中,我只想模拟该特定方法的响应。通过以下方式:
Validator.validateIssueDates(_) >> null
我希望进行其他验证,但不希望进行此验证。基本上我想实现 this 但使用 spock。我想消除 validateIssueDates()
方法的执行
解决方案使用 Spock
使用[@SpringSpy][2]完成。
首先,我们用一个 spring bean 注释字段,我们想将其包装在 spy 对象中。例如:
@SpringSpy
private CarValidator carValidator;
然后在我们的测试中,在 then
部分我们定义了我们希望如何覆盖 bean/spy:
中的方法
then:
3 * carValidator.validateIssueDates(_) >> null
使用 Mockito
的解决方案(作为附加方法,它与 spock 解决方案无关)
我在 Mockito
中使用 spy
非常容易。尽管 spock
的 spy
进行了许多试验(和错误),但它就是不想工作。如果我明白了,我会 post 在这里。目前只能分享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;
}
}
就是这样。看起来相当简单。
我在 spring 启动应用程序中用 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
class中还有其他方法。在我的 spock
集成测试中,我只想模拟该特定方法的响应。通过以下方式:
Validator.validateIssueDates(_) >> null
我希望进行其他验证,但不希望进行此验证。基本上我想实现 this 但使用 spock。我想消除 validateIssueDates()
方法的执行
解决方案使用 Spock
使用[@SpringSpy][2]完成。
首先,我们用一个 spring bean 注释字段,我们想将其包装在 spy 对象中。例如:
@SpringSpy
private CarValidator carValidator;
然后在我们的测试中,在 then
部分我们定义了我们希望如何覆盖 bean/spy:
then:
3 * carValidator.validateIssueDates(_) >> null
使用 Mockito
的解决方案(作为附加方法,它与 spock 解决方案无关)
我在 Mockito
中使用 spy
非常容易。尽管 spock
的 spy
进行了许多试验(和错误),但它就是不想工作。如果我明白了,我会 post 在这里。目前只能分享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;
}
}
就是这样。看起来相当简单。