【发布时间】:2020-07-02 13:10:06
【问题描述】:
最近我注意到我的团队在如何在 Reactor 中编写测试方面遵循两种方法。第一个是借助.block() 方法。它看起来像这样:
@Test
void set_entity_version() {
Entity entity = entityRepo.findById(ID)
.block();
assertNotNull(entity);
assertFalse(entity.isV2());
entityService.setV2(ID)
.block();
Entity entity = entityRepo.findById(ID)
.block();
assertNotNull(entity);
assertTrue(entity.isV2());
}
第二个是关于StepVerifier的使用。它看起来像这样:
@Test
void set_entity_version() {
StepVerifier.create(entityRepo.findById(ID))
.assertNext(entity -> {
assertNotNull(entity);
assertFalse(entity.isV2());
})
.verifyComplete();
StepVerifier.create(entityService.setV2(ID)
.then(entityRepo.findById(ID)))
.assertNext(entity -> {
assertNotNull(entity);
assertTrue(entity.isV2());
})
.verifyComplete();
}
以我的拙见,我会说第二种方法看起来更反应性。此外,官方文档对此非常清楚:
StepVerifier 提供了一种为异步发布者序列创建可验证脚本的声明方式,通过表达对订阅时将发生的事件的期望。
不过,我真的很好奇,应该鼓励使用哪种方式作为在 Reactor 中进行测试的主要途径。 .block() 方法应该完全放弃还是在某些情况下有用?如果有,这种情况是什么?
谢谢!
【问题讨论】:
-
StepVerifier允许您验证链中的各个事件,而block()只允许您在最后验证结果。我想不出任何理由使用block()而不是StepVerifier,但可以想到很多不这样做。 -
在 Mono 的情况下,我并没有真正看到 StepVerifier 的任何优势。
-
@MartinTarjányi 众多优势。您可以验证它是否有 subscribes/errors/completes/onNext 事件。您可以验证事件是否在时间限制内发生。验证元素是否已通过过滤器正确丢弃。验证subscriberContext 的各个方面+ 更多。 Block() 实际上只是在最后给你一个命令式的值。无法测试链中实际发生的情况。
-
这些对于 Flux 来说非常有用,但对于 Mono 来说却没有那么多。大多数情况下,我不需要这样的低级断言。
标签: unit-testing testing reactive-programming project-reactor