marble log

Webエンジニアの技術ブログです

StepVerifierでオブジェクトをテストしたいときはassertNextを使う

Spring WebFluxで登場するMonoやFluxをテストする際にはStepVerifierを使用する。 Mono<String>をテストする場合、以下のようにexpectNextメソッドを使うことでテストできる。

Mono<String> actual = Mono.just("test");
String expect = "test";

StepVerifier.create(actual)
        .expectNext(expect)
        .verifyComplete();

一方でオブジェクトをテストする場合にexpectNextは不適である。

class User {
    // コンストラクタなどは省略
    private final String name;
    private final int age;
}

上のようにUserクラスを定義し、Monoのテストを書くとき、

Mono<User> actual = Mono.just(new User("name", 20));
User expect = new User("name", 20);

StepVerifier.create(actual)
        .expectNext(expect)
        .verifyComplete();

ではフィールドの検証ではなくポインタの検証になってしまうため、このテストは落ちてしまう。

この場合はassertNextを使用し内部でassertThat().usingRecursiveComparison()を使用することで、フィールド同士を比較してくれる。

Mono<User> actual = Mono.just(new User("name", 20));
User expect = new User("name", 20);

StepVerifier.create(actual)
        .assertNext(t -> assertThat(t).usingRecursiveComparison().isEqualTo(expect))
        .verifyComplete()