Почему виртуальное время StepVerifer не работает на Flux? - PullRequest
0 голосов
/ 07 марта 2020

Я использовал учебник lite-rx-api-hands-on , чтобы попытаться узнать о реакторе, и я немного озадачен результатами одного из испытаний, пробуя виртуальное время с StepVerifier.

Это прекрасно работает:

@Test
public void expect10Elements() {
    StepVerifier.withVirtualTime(() -> Flux.interval(Duration.ofSeconds(1)).take(10))
                .thenAwait(Duration.ofSeconds(10))
                .expectNextCount(10)
                .expectComplete()
                .verify();
}

Но это не сработает

@Test
public void expect10Elements() {
    Flux<Long> flux = Flux.interval(Duration.ofSeconds(1)).take(10);

    StepVerifier.withVirtualTime(() -> flux)
                .thenAwait(Duration.ofSeconds(10))
                .expectNextCount(10)
                .expectComplete()
                .verify();
}

Я не совсем понимаю, почему это происходит, если я не подписываться на поток до его публикации в издательстве. Кто-нибудь может помочь?

1 Ответ

1 голос
/ 07 марта 2020

Это из-за способа реализации виртуального времени.

Для объяснения см. Справочник по реактору :

Эта функция виртуального времени подключается в пользовательском планировщике. на заводе по планированию реактора. Поскольку эти синхронизированные операторы обычно используют планировщик Schedulers.parallel () по умолчанию, замена его на VirtualTimeScheduler делает свое дело. Однако важным предварительным условием является создание оператора после того, как виртуальный планировщик времени был активирован .

Чтобы увеличить вероятность того, что это происходит правильно, StepVerifier не принимает простой поток как вход. withVirtualTime берет Поставщика, который ведет вас лениво, создавая экземпляр тестируемого флюса после настройки планировщика.

Будьте особенно осторожны, чтобы Supplier<Publisher<T>> можно было использовать лениво. В противном случае виртуальное время не гарантируется. Особенно избегайте создания экземпляра Flux ранее в тестовом коде и не позволяйте Поставщику возвращать эту переменную. Вместо этого всегда создавайте экземпляр потока внутри лямбды .

...