Java

JUnitのアサーションにAssertJを使う

投稿日:

Junit3時代はassertEqualsでアサーションしてJunit4になると当初はhamcrestでアサーションしておりましたが最近はAssertJを使っております。
AssertJはFluent assertions for javaと紹介されているのですが、わかりやすく言うとテストをメソッドチェインで書いていくことができます。

AssertJ

例えば、文字列のテストをするときは以下のようにかけます。


String content = "Hello World.";
assertThat(content).startsWith("Hello")
    .endsWith("World.")
    .contains(" ");

この例は多少無理矢理感がありますがAssertJを使うと型によりアサーションが補完されるので導入当初からスムーズに書くことができます。

自分がよく使うのはリストのアサーションです。
リストのアサーションは場合によっては前処理でリストから要素を抽出したりとテストをするためのプログラムを書く必要があると思いますがAssertJのリストのアサーションだとかなり直感的にテストをかけます。


List actual = Utils.extractByGender(persons, "male");
assertThat(actual).extracting("name")
        .hasSize(3)
        .containsExactly("user1", "user3", "user5");

これはactualリストのPersonオブジェクトからnameプロパティの値を取り出してテストしています。
リストの要素は3かつcontainsExactlyで指定された内容化テストしています。
containsExactlyはExactlyと要素と順番の完全一致を要求します。
他にもいろいろあってcontainsは要素が含まれていれば大丈夫だし、containsOnlyは要素は一致、順番は不一致でも大丈夫というアサーションもあります。
含まれないことを要求するdoesnot系もあります。

また複数プロパティのテストもできます。


List actual = Utils.extractGteByAge(persons, 35);
assertThat(actual).extracting("name", "age")
        .hasSize(3)
        .containsExactly(
                tuple("user3", 35),
                tuple("user4", 35),
                tuple("user5", 50));

こんな感じです。

自分がAssertJで一番好きなのは例外のテストです。
JUnitだと@Ruleを使って例外のテストをすると思います。

ガッチリとしたテストは書かずに例外が送出されインスタンスと簡単なメッセージのテストができればいい場合カジュアルに書きたいと思うことがあります。
その場合AssertJだと以下のようにかけます。


assertThatThrownBy(() -> { Utils.extractByGender(persons, null); })
        .isInstanceOf(IllegalArgumentException.class)
        .hasMessage("gender must be not null or empty.");

assertThatThrownBy(() -> { Utils.extractByGender(persons, ""); })
        .isInstanceOf(IllegalArgumentException.class)
        .hasMessage("gender must be not null or empty.");

assertThatThrownBy(() -> { Utils.extractByGender(persons, "root"); })
        .isInstanceOf(IllegalArgumentException.class)
        .hasMessage("gender can be choice only male or female.");

例外を流れるように読んでいけるので自分は最近はこの書き方がしっくりきています。

他にもPathFileのインスタンスを渡すと文字列の比較やfile or directoryなどをテストするアサーションがあります。

上記コードの詳細は以下に。
assertj-samples

-Java
-

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

JenkinsでwarファイルをTomcatにデプロイする方法

Tomcatサーバーへのデプロイは手動で行ってきました。 Antでリリースパッケージを作成して、SCP or FTPでリリース。原始的な方法です。 ですがJenkinsにTomcatのデプロイ用のプラ …

Maven2でDomaを使ったアプリケーションをコンパイルする方法

JavaのO/Rマッパーの金字塔はなんですかね。 自分で言うのもなんですが、僕は完全にO/Rマッパーの移行に失敗したので、この辺りは疎いのですが・・・。 そんな僕はDomaというO/Rマッパーを使って …

SpringMVCでPagenationを実装する方法

最近、SpringMVCを使って色々作っておりました。 今まで色々なフレームワークを触って、その度に挫折していましたが、SpringMVCは使えると思うように至りました。 業務ではないのですが、Spr …

no image

Commons-VFS2で再帰的にディレクトリ一覧を取得する方法

いつの間にかCommons-VFSが2にバージョンアップしています。 昔使ったんですけど、FTPの動作が微妙すぎてやめました・・・。 Javaでディレクトリを再起的に検索する方法はありふれているのです …

Tomcatのメモリ使用量をjconsoleを使って監視する方法

まれに、Tomcatのメモリ使用量をリアルタイムで知りたいということが無いでしょうか。 管理人はたまにあります・・・。 JDK5か6以降jconsoleという便利なツールが追加されまして、それを使って …