以编程方式断言 WebFlux 流的最佳方法是什么?
What is the best way to programmatically assert a WebFlux stream?
所以假设我们有类似的东西:
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 flux 方法做错了什么?我的意思是,从这个意义上说,我总是提供有序的数据,所以我假设 fromIterable 将按照 spring 启动应用程序接收到的顺序从该列表中使用。
感觉我在这里违反了某种原则...我的意思是它有效...
嗯,整理好了。
于是就有了expectNext
方法:
https://www.baeldung.com/flux-sequences-reactor
您可以在哪里预生成您的列表,然后断言如下:
List<String> expectedStrings = Arrays.asList(
"hello1", "hello2", "hello3"
);
...
StepVerifier.create(result)
.expectNextSequence(expectedStrings)
.verifyComplete();
编辑:显然我必须等几天才能将自己的问题标记为已回答?
所以假设我们有类似的东西:
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 flux 方法做错了什么?我的意思是,从这个意义上说,我总是提供有序的数据,所以我假设 fromIterable 将按照 spring 启动应用程序接收到的顺序从该列表中使用。
感觉我在这里违反了某种原则...我的意思是它有效...
嗯,整理好了。
于是就有了expectNext
方法:
https://www.baeldung.com/flux-sequences-reactor
您可以在哪里预生成您的列表,然后断言如下:
List<String> expectedStrings = Arrays.asList(
"hello1", "hello2", "hello3"
);
...
StepVerifier.create(result)
.expectNextSequence(expectedStrings)
.verifyComplete();
编辑:显然我必须等几天才能将自己的问题标记为已回答?