我在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()
方法
它是使用[@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): 但是,我仍然有大量对的调用,这些