【发布时间】:2020-04-17 04:47:18
【问题描述】:
我正在针对一些代码编写集成测试,这些代码在数据库中更新不同的值时异步创建记录。我想在创建记录后检查系统的状态,验证它是否按预期创建。因此,测试需要等到创建记录。
我可以使用 Mockito 为创建记录的函数创建一个间谍。 Mockito 甚至可以选择等待通过Mockito.timeout 调用该方法,如果经过一定时间而没有调用该方法,则放弃:
// Use or create/wire in spy. In my case, this is set up with @SpyBean from spring-boot-test.
RecordCreationService recordCreationServiceSpy = ...;
testClass.update(someValue);
Mockito.verify(recordCreationServiceSpy, Mockito.timeout(10_000)).createRecord(ArgumentMatchers.any());
但是,这只是等待调用开始,而不是等待调用完成。因此,这会进入一种竞争条件,在该条件下,验证可以在所需调用完成之前完成。
在使用 Mockito 在 JUnit 中进行验证之前,我如何才能干净而简单地等待流程完成?
【问题讨论】:
-
该方法是否可以返回
Future? -
@chrylis-onstrike- 不是真的,因为它是一个相当正交的功能。在这个特定的例子中,我有一个监听器监听数据库中的变化,并根据变化创建一个审计记录。因此,进行更新的方法不直接了解正在创建的审计记录。
标签: java asynchronous mockito integration-testing spy