我在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
我希望进行其他验证,但不是这次。基本上我想实现这一点,但有斯波克。我想取消执行的validateIssueDates()
方法
使用Spock
的解决方案
使用[@SpringSpy][2]完成
首先,我们用一个springbean来注释字段,我们想将其封装在spy对象中。例如:
@SpringSpy
private CarValidator carValidator;
然后在我们的测试中,在then
部分中,我们定义了如何从bean/spy:重写方法
then:
3 * carValidator.validateIssueDates(_) >> null
使用Mockito
的解决方案(作为一种附加方法,它与spock解决方案无关(
我在Mockito
中使用spy
非常容易。尽管spock
的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;
}
}
仅此而已。看起来相当简单。