【问题标题】:What is the best way to programmatically assert a WebFlux stream?以编程方式断言 WebFlux 流的最佳方法是什么?
【发布时间】:2025-12-08 01:20:04
【问题描述】:

所以让我们说我们有类似的东西:

public class SomeService {
...
public Flux<String> getStringsFromWebServer() {
  return webClient.get()
      .uri(this::generateSomeUrl)
      .retrieve()
      .bodyToMono(SomePojo.class)
      .map(SomePojo::getStringList)
      .flatMapMany(Flux::fromIterable);
}

编写如下所示的测试是否有意义:

void getStringsFromWebServer_shouldParseInOrderOfReceivingStrings() {
  // given
  // I have mocked up a WebClient, that is wired up to a Mocked Web Server
  // I am preloading the Mocked Web Server with this JSON
  String jsonStrings = "{'stringList': ['hello1', 'hello2', 'hello3']}"
  mockWebServer.enqueue(new MockResponse().setResponseCode(200))
      .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
      .setBody(jsonStrings);

  // when
  Flux<String> result = someService.getStringsFromWebServer();

  // then
  StepVerifier.FirstStep<String> fluxStep = StepVerifier.create(result);
  for (int i = 1; i < 4; i++) {
    String expectedInput = String.format("hello%d", i);
    fluxStep.assertNext(someString -> assertEquals(expectedInput, someString));
  }
  fluxStep.verifyComplete(); 
}

这是您以编程方式断言从 Flux 返回的顺序的方式吗?

我用 assertNext 通量方法做错了吗?我的意思是从这个意义上说,我总是提供有序的数据,所以我假设 fromIterable 将按照 Spring Boot 应用程序接收的顺序从该列表中消费。

感觉我在这里违反了某种原则......我的意思是它有效......

【问题讨论】:

    标签: java unit-testing java-stream project-reactor


    【解决方案1】:

    嗯,整理好了。

    于是就有了expectNext方法:

    https://www.baeldung.com/flux-sequences-reactor

    您可以在哪里预先生成您的列表,然后断言如下:

    List<String> expectedStrings = Arrays.asList(
      "hello1", "hello2", "hello3"
    );
    ...
    StepVerifier.create(result)
      .expectNextSequence(expectedStrings)
      .verifyComplete();
    

    编辑:显然我必须等待几天才能将自己的问题标记为已回答?

    【讨论】:

      最近更新 更多