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");
        }
    });
}

Validatorclass中还有其他方法。在我的 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 非常容易。尽管 spockspy 进行了许多试验(和错误),但它就是不想工作。如果我明白了,我会 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;
    }
}

就是这样。看起来相当简单。