My Photo

« JUnit その1 | Main | JUnit その3:テストクラスの構造化とパラメータ化テスト »

August 18, 2012

JUnit その2:aseertThat()とMatcher API

アサーション

アサーションとは比較検証の仕組みの事。
JUnit4.4以降では assertThat() と Matcher API を使用する。
以下のような特徴がある。

  • より自然言語(英語)に近い記述
  • 比較方法(Matcher)と検証フレームワーク(asertThat())の分離
  • より詳細なエラー情報

Matcher

Matcher は自然言語に近い記述をするためにstaticインポートして使う。
Matcher は org.hamcrest.CoreMacther#is() のようなstaticなファクトリメソッドを介して使用する。is()以外に次のようなさまざまなファクトリメソッドがある。

  • CoreMatcher#nulValue()
    実測値がnullであるかを評価する。
  • CoreMatcher#not()
    他の Matcher の評価値を反転する。
  • org.junit.matchers.JUnitMatcher#hasItem()
    リストや配列などIterableインタフェースを実装したクラスのインスタンスの実測値に期待する値が含まれているかを評価する。

カスタムMatcher

独自のMatcherを作ることができる。org.hamcrest.BaseMatcher を継承して作成するとよい。
BaseMatcher は org.hamcrest.Matcherインタフェースを実装しており、カスタムMatcherはファクトリメソッドとMatcherインタフェースのmatches()、describeTo() を実装する。

boolean matches(Object item)
評価するメソッド
void describeTo(Description description)
評価の失敗時に理由を通知するためのメソッド

DescriptionクラスのappendValue()で追加された値はダブルクウォーテーションで囲まれて表示される。appendText()で追加された値はダブルクウォーテーションで囲まれずそのまま表示される。

下記はDateの日付(年/月/日)だけを比較するカスタムMatcher。

package junit.tutorial;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;

/**
 * カスタムMatcher。Dateの日付(年/月/日)だけを比較する
 */
public class IsDate extends BaseMatcher<Date> {

	private final int year;
	private final int month;
	private final int date;
	
	Object actual;
	
	IsDate(int year, int month, int date) {
		this.year = year;
		this.month = month;
		this.date = date;
	}
	
	@Override
	public boolean matches(Object actual) {
		
		this.actual = actual;
		if (!(actual instanceof Date)) {
			return false;
		}
		
		Calendar cal = Calendar.getInstance();
		cal.setTime((Date)actual);
		if (year != cal.get(Calendar.YEAR)) {
			return false;
		}
		if (month != cal.get(Calendar.MONTH) + 1) {
			return false;
		}
		if (date != cal.get(Calendar.DATE)) {
			return false;
		}
		return true;
	}

	@Override
	public void describeTo(Description desc) {
		desc.appendValue(year + "/" + month + "/" + date);
		if (actual != null) {
			desc.appendText(" but actual is ");
			desc.appendValue(new SimpleDateFormat("yyyy/M/d").format((Date)actual));
		}
	}

	public static Matcher<Date> dateOf(int year, int month, int date) {
		return new IsDate(year, month, date);
	}
}

参考記事:WEB DB PRESS Vol.69 JUnit実践入門

« JUnit その1 | Main | JUnit その3:テストクラスの構造化とパラメータ化テスト »

「Java」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/55450829

Listed below are links to weblogs that reference JUnit その2:aseertThat()とMatcher API:

« JUnit その1 | Main | JUnit その3:テストクラスの構造化とパラメータ化テスト »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof