使用步进验证器测试助焊剂



我正在从该页面学习Reactive Programming:教程。我想知道为什么在下面的示例中,当我期望 4 条记录时,stact 跟踪会抛出实际一条记录的错误?

java.lang.AssertionError: expectation "expectNextCount(4)" failed (expected: count = 4; actual: counted = 1; signal: onComplete())
// TODO Create a StepVerifier that initially requests all values and expect 4 values to be received
StepVerifier requestAllExpectFour(Flux<User> flux) {
return StepVerifier.withVirtualTime(() -> Flux.just(flux))
.expectSubscription()
.thenRequest(4)
.expectNextCount(4)
.expectComplete();
}

我想知道我是否在这里错过了什么。

试试这个

StepVerifier requestAllExpectFour(Flux<User> flux) {
return StepVerifier.withVirtualTime(() -> flux)
.expectSubscription() 
.thenRequest(Long.MAX_VALUE) 
.expectNextCount(4) 
.expectComplete(); 
} 

或者像这样

StepVerifier requestAllExpectFour(Flux<User> flux) {
return StepVerifier.create(flux)
.expectSubscription() 
.thenRequest(Long.MAX_VALUE) 
.expectNextCount(4) 
.expectComplete(); 
} 

我认为问题是你通过使用Flux.just为通量提供单次通量发射。您可以只应用助焊剂本身:

.withVirtualTime(() -> flux)

源代码 -> https://github.com/reactor/lite-rx-api-hands-on

问题 -> https://github.com/reactor/reactor-addons/issues/61

指南 -> https://projectreactor.io/docs/core/release/reference/#_manipulating_time

下面的代码有效...

StepVerifier requestAllExpectFour(Flux<User> flux) {
List<User> users = new ArrayList<>(Arrays.asList(User.SKYLER, User.JESSE, User.WALTER, User.SAUL));
return StepVerifier.withVirtualTime(() -> 
Flux.interval(Duration.ofMillis(100))
.zipWith(Flux.fromIterable(users), (i, user) -> user))
.expectSubscription()  
.thenRequest(4) 
.thenAwait(Duration.ofMillis(400))
.expectNextCount(4)  
.expectComplete();  
}

我猜练习想要的是使用构造函数使用请求初始化StepVerifier,如下所示:

StepVerifier requestAllExpectFour(Flux<User> flux) {
return StepVerifier.create(flux, 4)
.expectNextCount(4)
.expectComplete();
}

最新更新