首页 > 解决方案 > Flux 为 StepVerifier 返回未排序的数据

问题描述

我希望在将三个元素写入数据库后收到两个元素。该查询返回一个 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()
}

这总是抛出

预期值:BuchungssatzEntity(...sequentialId=2 ...); 实际值:BuchungssatzEntity(...sequentialId=3 ...)

我不想在数据库查询中添加排序,这是浪费时间。如何使用“所有这些元素但以任何顺序”测试 Flux,或者在这种情况下我应该只选择 Mono,返回一个列表并自己完成其余的工作?再说一次,这不是我使用反应式的原因。

PS:这个测试的目标是验证我的 Spring 查询语言语句过滤是否正确。

- - - - 更新

我通过使用解决了它

StepVerifier.create(inventoryFinder.findAllPendingPurchases())
    .recordWith { listOf<PurchasesModel>() }
    .thenConsumeWhile { i: Any? -> purchases.contains(i) }
    .consumeRecordedWith{ }
    .verifyComplete()

标签: springkotlinspring-webflux

解决方案


一种方法是将thenConsumeWhile运算符与expectNextCount. 如果序列中有任何元素不匹配,StepVerifier 将出错。

在 Java 中:

List<Item> pendingItems = List.of(pending, next_pending);

Flux<Item> items = inventoryFinder.findAllPendingPurchases();

StepVerifier.create(items)
        .expectNextCount(2) //expecting 2 elements
        .verifyComplete();

StepVerifier.create(items)
        .thenConsumeWhile((i) -> pendingItems.contains(i)) // check if element was expected
        .verifyComplete();

推荐阅读