【问题标题】:spock, mock a method response in a spring beanspock,在 spring bean 中模拟方法响应
【发布时间】:2018-11-28 19:57:21
【问题描述】:

我在 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

我希望进行其他验证,但不是这个。基本上我想实现this,但要使用spock。我想消除 validateIssueDates() 方法的执行

【问题讨论】:

标签: spring spock


【解决方案1】:

使用Spock的解决方案

使用 [@SpringSpy][2] 完成。
首先,我们用要包装在 spy 对象中的 spring bean 来注释字段。例如:

@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;
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多