如何使用StepVerifier对Flux返回的无序数据实现无顺序元素校验?
无序Flux返回结果的测试实现
问题描述
向数据库写入3条测试数据后,预期查询返回2个符合过滤条件的元素,查询返回Flux类型且返回元素无固定顺序。原测试代码如下:
@Test fun `SUCESSFULLY query pending purchases`() { // arrange val arrived = TestDataFactory.buchungssatzEntity( sequentialId = 1, arrived = true ) val pending = TestDataFactory.buchungssatzEntity( sequentialId = 2, arrived = false ) val next_pending = TestDataFactory.buchungssatzEntity( sequentialId = 3, arrived = false ) // act buchhaltungWriter.save(arrived) buchhaltungWriter.save(pending) buchhaltungWriter.save(next_pending) val purchases = inventoryFinder.findAllPendingPurchases() // assert StepVerifier.create(purchases) .expectNext(pending) .expectNext(next_pending) .verifyComplete() }
原测试执行时始终抛出如下错误:
expected value: BuchungssatzEntity(... sequentialId=2 ...); actual value: BuchungssatzEntity(... sequentialId=3 ...)
核心需求:不希望给数据库查询添加排序逻辑(避免产生不必要的性能开销),需要实现「校验返回结果包含全部指定元素、不限制返回顺序」的测试逻辑,同时不需要改为Mono返回列表自行校验,避免违背响应式编程的设计初衷。
补充说明:该测试的目标是验证Spring查询语句的过滤逻辑是否正确。
最终解决方案
通过StepVerifier的录制消费能力即可实现无序校验,无需修改原有查询逻辑,实现代码如下:
StepVerifier.create(inventoryFinder.findAllPendingPurchases()) .recordWith { listOf<PurchasesModel>() } .thenConsumeWhile { i: Any? -> purchases.contains(i) } .consumeRecordedWith{ } .verifyComplete()
内容的提问来源于stack exchange,提问作者nykon
相关产品推荐
相关产品推荐

