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

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

関連記事

Spring MVCでビューにApache Tilesを使う

Spring MVCはデフォルトのビューはJSPみたいですね。 JSPでも問題ないのですが、せっかくなのでTilesを使ってみたいと思います。 僕の印象ではTilesは、それ自体がテンプレートシステム …

Spring MVCでHelloWorld Maven2からEclipse編

先日よりはじめて触ったSpingMVC。 取り急ぎ、環境構築をしてみます。 初めてなので、WEBのチュートリアルみたいなのを見ながら始めました。 今回の目標はMaven2でひな形を作って、それをEcl …

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

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

SpringMVCを使ってみることにしました。

Tomcat3時代のころからJavaでウェブアプリケーションを使っておりますが、フレームワークはあんまり使ったことがありません。 業界標準?だったStruts1も試しに使ってみてxml書くのと存在意味 …

no image

Mavenでコンパイル時のJDKバージョンを指定する方法

久々にMavenを使う機会がありjar:jarを実行したら、コンパイルエラーが出力されてjarファイルが生成できませんでした。 コンパイルしているマシンがJava7で、どうもJava7で文字コード関連 …