当前位置: 首页 > 知识库问答 >
问题:

spock,模拟Springbean中的方法响应

钱繁
2023-03-14

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

验证程序类中还有其他方法。在我的spock集成测试中,我只想模拟该特定方法的响应。以以下方式:

Validator.validateIssueDates(_) >> null

我希望进行其他验证,但不是这次。基本上,我想实现这一点,但与斯波克。我想取消执行validateisuedates()方法

共有1个答案

毋澄邈
2023-03-14

它是使用[@SpringSpy][2]完成的
首先,我们用一个springbean对字段进行注释,我们希望将其封装在spy对象中。例如:

@SpringSpy
private CarValidator carValidator; 

然后在我们的测试中,在然后部分中,我们定义了我们希望如何从bean/spy重写方法

then:
    3 * carValidator.validateIssueDates(_) >> null

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

仅此而已。似乎相当简单。

 类似资料:
  • 所以我想做一些事情 但我得到了空异常

  • 我不明白为什么不能将模拟的预定义行为移到and:块中。

  • 我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?

  • 1)创建groovy项目 2)创建接口: 3)创建spock测试: 有没有更好的方法来“解释”spock被模仿函数的最后一个参数是vararg,因此可以省略它?

  • 我在我的类中有一个方法,如下所示,我试图测试它: 在上面,是一个方法,它将文件名作为参数。它从AWS S3中获取该文件的inputstream。在测试Spock的方法时,我希望为方法提供一个模拟,因为我不想使用类中的这个方法的实现,因为它转到了另一个bucket名称。

  • 注意:这个示例非常简单,但它得到了我想要实现的跨越的想法。 我有一个类(称为),它接受作为构造函数参数;它有一个方法,该方法生成一个执行以下操作的新线程(为简洁起见,大大减少了): 在正常操作中,调用会阻塞,直到与建立连接为止。 但这让我产生了错误的感觉;我不是真的在寻找至少一个互动,我真的在寻找一个互动。 我可以这样做(返回一次模拟的套接字,然后返回null): 但是,我仍然有大量对的调用,这些