You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:51:04