JUnit4 で JavaBeans の assertThat を簡潔に書きたい

公開日: : 最終更新日:2014/05/06 JUnit4 ,

今回も JUnit ネタです。

前回は List の assertThat を簡潔に書く方法についての記事になりましたが、今回は JavaBeans の assertThat を簡潔に書く方法に着いての記事になります。

この方法を使うと、プロパティ1つずつに assert を書かなくてもいいのでテストが簡潔に書けるようになります。

icatch-8536919558_0e01e5dc77

Some rights reserved by Waag Society

目次

1. 動作環境

動作環境は次の通りです。

1-1. Java

まずは Java のバージョン。

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

1-2. JUnit

JUnit は2013年8月26日時点での最新である 4.11 を使いました。

JAR のダウンロードですが、Maven であれば次の dependency を pom.xml に貼り付けます。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

そうしたら、次のコマンドを実行すればローカルリポジトリに JAR がダウンロードされます。

mvn eclipse:eclipse -DdownloadSources=true

また Maven を使わずに JAR をダウンロードして直接プロジェクトに組み込む場合は次のサイトからダウンロードできます。
ダウンロードページの URL は次になります。

1-3. hamcrest-library

プロパティを一括して assert するライブラリを別途追加します。
hamcrest-library をインポートします。

pom.xml に次を追加して JAR をダウンロードしてください。

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>

インポートするコマンドは ↑ と同じです。

2. 検証用の JavaBeans

このあとのテストケースで使用する JavaBeans のコードを先に乗せておきます。

Student クラスです。
3つの属性(氏名、学生証番号、年齢)をフィールドに持つ JavaBeans になります。

public class Student {

    /**
     * 氏名
     */
    private String name;

    /**
     * 学生証番号
     */
    private String studentIdNumber;

    /**
     * 年齢
     */
    private int age;

    private Student(String name, String studentIdNumber, int age) {
        this.name = name;
        this.studentIdNumber = studentIdNumber;
        this.age = age;
    }

    public static Student newInstance(String name, String studentIdNumber, int age) {
        return new Student(name, studentIdNumber, age);
    }

    public String getName() {
        return name;
    }

    public String getStudentIdNumber() {
        return studentIdNumber;
    }

    public int getAge() {
        return age;
    }

}

3. JavaBeans のプロパティについての assert をベタに書く

この Student クラスについて、ベタに属性の assert を書くとこんな感じになります。

@Test
public void ベタにgetterを使って確認するテストケース() throws Exception {
    // Setup
    // Student オブジェクトに設定する属性を定義する
    String name = "学生太郎"; // 学生の氏名
    String studentIdNumber = "abc123456"; // 学生証番号
    int age = 20; // 年齢
    
    // Exercise
    // Student オブジェクトを生成する
    Student student = Student.newInstance(name, studentIdNumber, age);
    
    // Verify
    // 生成した Student オブジェクトの属性を個々に確認する
    assertThat(student.getName(), is(name)); 
    assertThat(student.getStudentIdNumber(), is(studentIdNumber)); 
    assertThat(student.getAge(), is(age)); 
}

フィールドに設定されている値をテストするには、個々に assertThat を書くしかないじゃんと思っていたので、何の疑いもなくこのように書いてました。

何をやっているのかパッと見ただけですぐに分かりますが冗長なコードになってしまいます。

4. 属性値を簡潔に確認するメソッドがあった!

上記のような冗長な方法ではなくもっと簡潔に書けるメソッドが hamcrest-library に用意されています。

次のメソッドを使うと assertThat はこんな感じに書けます。

  • org.hamcrest.beans.SamePropertyValuesAs#samePropertyValuesAs(T expectedBean)
@Test
public void SamePropertyValuesAsを使ったアサーション() throws Exception {
    // Setup
    // Student オブジェクトに設定する属性を定義する
    String name = "学生太郎"; // 学生の氏名
    String studentIdNumber = "abc123456"; // 学生証番号
    int age = 20; // 年齢
    // 検証用の Student オブジェクトを生成する
    Student expected = Student.newInstance(name, studentIdNumber, age);
        
    // Exercise
    // Student オブジェクトを生成する
    Student student = Student.newInstance(name, studentIdNumber, age);
    
    // Verify
    // org.hamcrest.beans.SamePropertyValuesAs#samePropertyValuesAs を使って生成した Student オブジェクトの属性を確認する
    assertThat(student, is(SamePropertyValuesAs.samePropertyValuesAs(expected))); 
}

たった1行に assertThat をまとめられるので複数書く手間が省けていい感じのコードになります。

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

junit-logo

JUnit4 のパラメータ化テストは4通りの方法で書ける

JUnit 本である「JUnit実践入門」でテストの書き方を勉強しています。 本書でも紹介されている

記事を読む

junit-logo

JUnit4 で List の assertThat を簡潔に書きたい

Java でプログラムを書くときは、プライベート・仕事を問わず JUnit を使ってユニットテストを

記事を読む

junit-logo

JUnit4 の Enclosed を使ったテストクラスサンプル

JUnit 本である「JUnit実践入門」を読んでいます。 体系的にまとめられている良書で、勉強にな

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


一 + 5 =

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑