当前位置: 首页 > 知识库问答 >
问题:

使用schedulers.single()在Reactor步进验证器中重新抛出AssertionErrors

楚知
2023-03-14

我们使用Project Reactor按照下面ServiceTest中的代码异步运行特定操作。为了测试这段代码,按照下面的ServiceTest,在为异步操作设置Mono时,我们使用doonnext将Mono的结果传递给DirectProcessor,然后使用stepVerifier执行测试调用和断言。

stepverifier#assertNext的JavaDoc读取

使用者抛出的任何AssertionErrors都将在验证期间重新抛出。

是否可以,如果可以,如何使用单个调度程序,并在验证过程中根据Javadoc重新抛出AssertionErrors?

@Service
@RequiredArgsConstructor
public class Service implements WithReactive, WithTestProcessor<Response> {

    @Getter
    @Setter
    private DirectProcessor<Response> processor = DirectProcessor.create();

    @Setter
    private Scheduler scheduler = Schedulers.single();

    public void doAction() {
        Mono.fromSupplier(this::doActionAsync)
            .doOnNext(processor::onNext)
            .subscribeOn(scheduler)
            .subscribe();
    }

    private Response doActionAsync() {
        ...
    }

    ...

}
public interface WithReactive {
    void setScheduler(Scheduler scheduler);
}
public interface WithTestProcessor<T> {
    void setProcessor(DirectProcessor<T> processor);
    DirectProcessor<T> getProcessor();
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {

    @Inject
    private Collection<WithTestProcessor> withTestProcessors;

    @Before
    public void setTestProcessors() {
        withTestProcessors.forEach(withTestProcessor -> withTestProcessor.setProcessor(DirectProcessor.create()));
    }

    @Inject
    private Collection<WithReactive> withReactives;

    @Before
    public void makeReactiveSynchronous() {
        withReactives.forEach(withReactive -> withReactive.setScheduler(Schedulers.immediate()));
    }

    @Test
    private void test() {
      StepVerifier.create(service.getProcessor())
          .then(service::doAction)
          .assertNext(response -> assertThat(logExtractor.getInsertsByTable("assets")).hasSize(1))
          .thenCancel()
          .verify();
    }
}

共有1个答案

璩华辉
2023-03-14

这是三个因素的结合:最初的然后,订阅与验证同时发生的事实,由于subscribeon,以及thencancel

一种解决方法是,在StepVerifier执行thencancel之前,给thenawait(Duration.ofMillis(10))足够的时间让onnext发生,方法是在thencancel之前放一个thenawait(duration.ofMillis(10))

 类似资料:
  • 下面是在数据库中检查重名的代码 下面是测试validateDuplicateName方法的测试脚本 但是测试失败,出现以下错误 我能找人帮忙吗?

  • 我的验证器类 当我没有选择任何选项就提交表单时, 无法将类型java.lang.String的属性值转换为属性类别所需的类型com.main.java.category;嵌套异常为java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为属性类别所需的类型[com.main.java.category]:找不到匹配的编辑器或转换策略 这

  • 问题内容: 在为Java API编写单元测试时,可能需要在某些情况下执行更详细的异常验证。即比JUnit 提供的 @test 注释所提供的更多。 例如,考虑一个应该从其他接口捕获异常的类,包装该异常并抛出该包装的异常。您可能要验证: 引发包装异常的确切方法调用。 包装异常具有原始异常为其原因。 包装器异常的消息。 这里的要点是希望在单元测试中对异常进行额外的验证(而不是关于是否 应该 验证异常消息

  • 问题内容: 我有一个关于Java中重新引发异常的非常简单的问题。 这是代码片段: 为什么我们需要在第一个版本中重新抛出,而第二个版本看起来更优雅?可能有什么好处,并且优先选择哪个版本? 问题答案: 你是对的。第二版更好。而且,第一个版本没有任何意义。除了异常的堆栈跟踪为“错误”之外,它的功能相同。 有“重新抛出”异常的原因如下: 如果您之前有事要做。 如果捕获一种类型的异常并抛出另一种类型的异常:

  • 我明白验证在应用程序的几个层中都是必需的。但是,如果要在所有层中实施的验证都是相同的(大多数情况下都是这样),那么使用一个公共的验证框架是有意义的。这是Hibernate验证器的目标之一。 那么,哪条路走得更好呢?

  • 我正在使用测试值: 我现在想做的是测试Mono中是否缺少一个项目。这样地: 我想测试单声道实际上是空的。我该怎么做呢?