spock,模拟springbean中的方法响应



我在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非常容易。尽管spockspy有很多尝试(和错误(,但它就是不想工作。如果我收到了,我会把它贴在这里。目前,我只能分享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;
}
}

仅此而已。看起来相当简单。

最新更新