- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Spring Reactor Core 3.0.6 并且我有一个返回 Flux 的方法:
public Flux<Foo> createFlux(){
return Flux.<List<Foo>,String>generate(/* generator omitted for clarity's sake */ )
.take(Duration.ofSeconds(10)
.flatMap(Flux::fromIterable);
}
生成器函数调用一个分页的 REST api 来获取结果,如果 API 继续返回数据,我希望 Flux 只运行 10 秒。
它工作正常,但我想创建一些单元测试,但我在创建测试以验证 Flux 最多只运行 10 秒时遇到了麻烦。
我模拟了 rest 服务,让它总是返回数据并写下:
StepVerifier.withVirtualTime(() -> createFlux())
.thenAwait(Duration.ofSeconds(10))
.verifyComplete();
但失败了:
java.lang.AssertionError: expectation "expectComplete" failed (expected: onComplete(); actual: onNext([my toString() Foo bean]))
我想我应该以某种方式使用生成的项目,但我无法找到正确的 StepVerifier 方法来这样做。
编辑
我尝试使用 thenConsumeWhile
跳过所有项目:
StepVerifier.withVirtualTime(() -> createFlux())
.thenAwait(Duration.ofSeconds(10))
.thenConsumeWhile(t -> true)
.verifyComplete();
但现在测试只是无限期地运行,永远不会结束。
最佳答案
生成器实际上可能非常重要……StepVerifier
受限于无限序列,在使用虚拟时间时更是如此。问题在于生成器和 thenAwait
都在主线程中运行,因此无限生成器会阻止 stepverifier 提前时间,从而防止序列超时。
由于您想测试take
的持续时间,我认为虚拟时间不合适(您正在测试模拟时间)。我将使 createFlux 方法可参数化为持续时间,并执行 StepVerifier.create()
,持续时间要短得多。
如果你真的想使用某种形式的虚拟时间,我发现让它工作的最低要求是
Scheduler
将生成器循环隔离在非虚拟 线程上,然后使用 subscribeOn(scheduler)
在 StepVerifier 的 Supplier
中。.expectNextCount(1)
,确保所有内容都已订阅且数据开始流动,然后再尝试提前。像这样:
public Flux<Integer> createFlux() {
return Flux.<List<Integer>>generate(sink -> {
sink.next(Arrays.asList(1, 2, 3));
})
.take(Duration.ofSeconds(10))
.flatMap(Flux::fromIterable);
}
@Test
public void so44657525() throws InterruptedException {
Scheduler scheduler = Schedulers.newSingle("test");
AtomicInteger adder = new AtomicInteger();
StepVerifier.withVirtualTime(() -> createFlux()
.subscribeOn(scheduler)
.doOnNext(v -> adder.incrementAndGet())
)
.expectNextCount(1)
.thenAwait(Duration.ofSeconds(10))
.thenConsumeWhile(t -> true)
.verifyComplete();
System.out.println("Total number of values in generated lists: " + adder.get());
}
将 expectNextCount(1)
修改为 expectNextCount(100_000)
,我运行时打印了 Total number of values in generated lists: 102405
花了 40 毫秒。
关于java - 使用 StepVerifier 对 Flux.take(Duration duration) 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44657525/
我正在从该页面学习响应式编程:tutorial 。我想知道为什么在下面的示例中,当我期望 4 条记录时,stact Trace 会抛出实际一条记录的错误? java.lang.AssertionErr
StepVerifier 有一个 assertNext 方法,允许对下一个元素的值执行断言。 StepVerifier.create(dataFlux) .assert
我正在使用reactor-test项目和 StepVerifier测试我的功能,myFunc ,返回 Flux : Flux results = myFunc() StepVerifier.creat
我正在测试助焊剂。我不知道通量到底有多少元素。最初我尝试过 StepVerifier 并遇到了一些问题,因为我不知道这些元素。后来我提到了这个question并尝试了相同的方法,但出现以下错误:jav
我想验证每个 onNext 发射是否匹配给定的谓词。 我试过 expectNextMatches: StepVerifier.create(...) .expectNextMatches {
我想验证每个 onNext 发射是否匹配给定的谓词。 我试过 expectNextMatches: StepVerifier.create(...) .expectNextMatches {
我正在尝试使用 Reactor 的虚拟时间功能,但测试会无限期地阻塞(没有超时)或抛出 AssertionError(有超时): @Test public void test() { St
我正在尝试使用 StepVerifier 测试 Mono.delay。我的代码如下: Mono[Long] mono = Mono.delay(Duration.ofDays(5)); StepVer
最近我注意到我的团队遵循两种方法来编写 Reactor 中的测试。第一个是在 .block() 的帮助下方法。它看起来像这样: @Test void set_entity_version() {
我们正在使用Project Reactor 按照下面 ServiceTest 中的代码异步运行特定操作。要测试此代码,请按照下面的 ServiceTest 设置 Mono对于异步操作,我们让 Mono
我正在使用 StepVerifier 来测试值: @Test public void testStuff() { Thing thing = new Thing(); Mono res
我正在使用 Spring Reactor Core 3.0.6 并且我有一个返回 Flux 的方法: public Flux createFlux(){ return Flux.,String
如果我直接将 Flux 与 StepVerifier 一起使用,则一切正常,但如果我在 Flux 上调用 publish().autoConnect() 并将结果与 StepVerifier 一起
我正在学习 Java 11 react 器。我看过这个例子: StepVerifier.withVirtualTime(() -> Flux.interval(Duration.ofSecon
我是一名优秀的程序员,十分优秀!