跳到正文

StepVerifier-步骤验证器及其使用方法

3 分钟阅读 607 字 0 查看原文 →

StepVerifier

描述

到目前为止,你对每个练习的解答都是通过将 Publisher 你定义的答案传递给一个测试用例来检查的 StepVerifier
该工件中的此类 reactor-test 能够订阅任何 Publisher (例如,Flux Akka Stream 或 A 流……),然后断言一组关于该序列的用户定义期望。
如果触发的任何事件与当前预期不符,则会 StepVerifier 产生一个 AssertionError

StepVerifier 您可以从静态工厂获取一个实例 create。它提供了一个 DSL,用于设置数据部分的预期,并以单个终端预期(完成、错误、取消……)结束。

请注意,您必须始终调用该 verify() 方法或结合终端期望和验证的快捷方式之一,例如 .verifyErrorMessage(String)。否则,它将 StepVerifier 不会订阅您的序列,也不会断言任何内容。

StepVerifier.create(T<Publisher>).{expectations...}.verify()

有很多可能的预期,请参阅 参考文档javadoc

实践

在这些练习中,方法会接收一个 Flux 或者 Mono 对象作为参数,你需要测试它的行为。你应该创建一个StepVerifier使用该 Flux/Mono 对象的测试用例,描述对它的预期并进行验证。


public class Part03StepVerifier {

    /**
     * Learn how to use StepVerifier to test Mono, Flux or any other kind of Reactive Streams Publisher.
     *
     * @author Sebastien Deleuze
     * @see <a href="https://projectreactor.io/docs/test/release/api/reactor/test/StepVerifier.html">StepVerifier Javadoc</a>
     */

//========================================================================================

    // TODO Use StepVerifier to check that the flux parameter emits "foo" and "bar" elements then completes successfully.
    public void expectFooBarComplete(Flux<@NonNull String> flux) {
        StepVerifier.create(flux)
                .expectNext("foo")
                .expectNext("bar")
                .expectComplete()
                .verify();
    }

//========================================================================================

    // TODO Use StepVerifier to check that the flux parameter emits "foo" and "bar" elements then a RuntimeException error.
    public void expectFooBarError(Flux<@NonNull String> flux) {
        StepVerifier.create(flux)
                .expectNext("foo")
                .expectNext("bar")
                .expectError(RuntimeException.class)
                .verify();
    }

//========================================================================================

    // TODO Use StepVerifier to check that the flux parameter emits a User with "swhite"username
    // and another one with "jpinkman" then completes successfully.
    public void expectSkylerJesseComplete(Flux<@NonNull User> flux) {
        StepVerifier.create(flux)
                .expectNextMatches(user -> "swhite".equals(user.getUsername()))
                .expectNextMatches(user -> "jpinkman".equals(user.getUsername()))
                .expectComplete()
                .verify();
    }

//========================================================================================

    // TODO Expect 10 elements then complete and notice how long the test takes.
    public void expect10Elements(Flux<@NonNull Long> flux) {
        StepVerifier.create(flux)
                .expectNextCount(10)
                .expectComplete()
                .verify();
    }

//========================================================================================

    // TODO Expect 3600 elements at intervals of 1 second, and verify quicker than 3600s
    // by manipulating virtual time thanks to StepVerifier#withVirtualTime, notice how long the test takes
    public void expect3600Elements(Supplier<Flux<@NonNull Long>> supplier) {
        StepVerifier.withVirtualTime(supplier)
                .expectSubscription()
                .thenAwait(Duration.ofSeconds(3600))
                .expectNextCount(3600)
                .expectComplete()
                .verify();
    }

}
    @Test
    public void TestStepVerifier(){
        Part03StepVerifier pt3 = new Part03StepVerifier();
        pt3.expectFooBarComplete(Flux.just("foo", "bar"));
        // pt3.expectFooBarError(Flux.just("","foo", "bar"));
        pt3.expectSkylerJesseComplete(Flux.just(User.SKYLER, User.JESSE));

        Flux<@NonNull Long> fluxWith10Elements = Flux.interval(Duration.ofMillis(100)).take(10);
        pt3.expect10Elements(fluxWith10Elements);

        Supplier<Flux<@NonNull Long>> supplier = () -> Flux.interval(Duration.ofSeconds(1))
                .take(3600)
                .map(i -> i + 1);
        pt3.expect3600Elements(supplier);
    }

相关文章

学习如何创建 Mono 实例

学习如何创建 Mono 实例 Flux 描述 AMono&lt;T&gt;是一个响应式流 Publisher,还增强了许多可用于生成、转换、编排 Mono 序列的操作符。 它是最多 Flux 可以发出 1 个&lt;T&gt;元素的特例:Mono 要么有值(包含元素),要么为空(不包含元素),要么失败(错误)。 AMono&lt;Void&gt;可用于仅对完成信号感兴趣的情况(相当于 Reacti...

响应式编程简介

响应式编程入门 Reactor 3 是一个围绕该规范构建的库,将响应式编程Reactive Streams范式引入JVM。 在本课程中,你将熟悉 Reactor API。那么,让我们快速介绍一下响应式流和响应式编程中更通用的概念。 为什么 响应式编程是一种新的编程范式,它使用声明式代码(类似于函数式编程)来构建异步处理管道。它是一种基于事件的模型,数据一旦可用就会被推送给消费者:我们处理的是异步事...

语义化版本 2.0.0

原文 https://semver.org/lang/zh-CN/ title: 语义化版本 2.0.0 language: zh-CN author: Wayou Liu 语义化版本 2.0.0 摘要 版本格式:主版本号.次版本号.修订号,版本号递增规则如下: 主版本号:当你做了不兼容的 API 修改, 次版本号:当你做了向下兼容的功能性新增, 修订号:当你做了向下兼容的问题修正。 先行版本号及...

bigroc 头像
bigroc

热爱技术的开发者,持续分享 Java、JavaScript、Go、Docker、AI 等领域的编程经验和技术思考。

评论

滚动到评论区域时再加载第三方评论脚本。