Spring Boot/開発/テスト/AssertJ

Spring Boot/開発/テスト/AssertJ

Spring Boot のテストの値検証では AssertJ という検証ライブラリを使う。

やってることは今までの assertThat なんかと同じなので、何もしなくても jUnit 内でそのまま使える。 しかし書き方が違っていて、テスト対象を決めたらあとはそこからメソッドチェーンで宣言的に条件をズラズラ書けるので IDE の補完だけで大体やりたいことが出来るという利点があるモノである。

AssertJ / Fluent assertions for java

基本

このようになる。

import static org.assertj.core.api.Assertions.*;
assertThat(a)
        .as("hogehoge check")
        .isNotNull()
        .isNotBlank()
        .isEqualTo("hoge");

結果 a に対して条件をズラズラ書く。 この条件の一覧は IDE の補完が利くのでサクサク書ける

as はこの検証におけるコメントのようなもので、失敗時にどこで失敗したかをわかりやすくする。

インスタンスのメンバの検証

あるメソッドの結果インスタンスが生成されそのインスタンスをチェックしたいということが多いだろう。 ほとんどの場合においてインスタンスの検証はインスタンスの各メンバに全部正しい値が入っているかということになるだろう。

ここで値を1個1個取り出して書いてもいいのだが単にそのものズバリを検証するだけなら簡単な書き方がある。

assertThat(a)
    .isNotNull()
    .extracting("id", "name", "age").containsExactly(123L, "unko", 42);

このように書ける。この extracting にずらずら書いているのはそのインスタンスの getter を表していて、 getId ならば id と書ける。containsExactly というのは完全一致を調べるモノになる。 これで簡単なインスタンスのチェックはできるようになったと思う。

ほとんどのインスタンス値はこれでチェックできると思われる。↓の「独自の assertThat」を作ってもいいとは思うが若干オーバースペックな気がする。

独自の assertThat

Doma とかでは Entity にドメインクラスを多用するため堅牢にはなるのだが、逆に Entity から取り出す値の検証部分の記述が煩雑になってしまう。 そこで対象を検証する専用の assertThat を作って記述をシンプル化する

もうほぼ書き方が決まっていて単にコピペすればいいだけだろう。 この独自の assertThat 自体が Entity のテストコードのようだ。

public class HogeAssert extends AbstractAssert<HogeAssert, Hoge>{
    public HogeAssert(Hoge actual) {
        super(actual, HogeAssert.class);
    }
 
    public static HogeAssert assertThat(Hoge actual) {
        return new HogeAssert(actual);
    }
 
    public HogeAssert hasName(String name) {
        isNotNull();
        if(actual.getName() == null) {
            failWithMessage("Expected name is Null");
        }
        // check condition
        if(!Objects.equals(actual.getName().getValue(), name)) {
            failWithMessage("Expected name to be <%s> but was <%s>", name, actual.getName().getValue());
        }
        return this;
    }
    public HogeAssert hasAge(int age) {
        isNotNull();
        if(actual.getAge() == null) {
            failWithMessage("Expected age is Null");
        }
        // check condition
        if(!Objects.equals(actual.getAge().getValue(), age)) {
            failWithMessage("Expected age to be <%d> but was <%d>", age, actual.getAge().getValue());
        }
        return this;
    }    
}

このように作っておくと実際のテストでは

HogeAssert.assertThat(hoge)
        .hasName("yamada")
        .hasAge(10);

このように記述が簡素化する。

AssertJ-db

DB を検証するためのツールとなる。これは基本的に Java のインスタンスや値をチェックするモノではなく、 DB状態の変化をチェックするもので更新系メソッドの検証時に使うことになるだろう。

java/spring/spring_boot/dev/test/assertj/start.txt · 最終更新: 2019-07-02 10:40 by ore