このページでは
Matchers(CoreMatchers)の基本検証と組合せについて
注意点と使い方をまとめる。

基本検証
メソッド 概要 CoreMatchers Matchers
is() eaualsTo()のショートカット or Matcherをそのまま評価
not() 評価の反転(否定)。is()の否定版
nullValue() nullであることの検証
notNullValue() not nullであることの検証
equalsTo() eauals()を用いた検証
sameInstance() 「==」による検証
theInstance() 「==」による検証(sameInstance()と同等)
isA() instanceOf()のショートカット
any() Class.isInstanceOf()による検証(instanceOf()と同等)
instanceOf() Class.isInstanceOf()による検証
anyThing() 常に評価がtrue
組合せ
メソッド 概要 CoreMatchers Matchers
allOf() AND条件
anyOf() OR条件
both() 両方正しいかの検証
either() どちらか正しいかの検証

基本

is() - eaualsTo()のショートカット or Matcherをそのまま評価

オーバーロードにより、
引数がMatcherオブジェクトか否かでどちらかになる。

nullを渡すこともできるが、
nullを検証する場合はnullValue()を利用するのが自然。

assertThat() + Matcherスタイルの中核なので
よく使うことになるが
実はis()の独自処理はほとんど無い。

equals()のショットカット
String expected = "Hello World";
String actual = "Hello" + " " + "World";
assertThat(actual, is(expected));
Matcherをそのまま評価
String actual = "Hello World";
assertThat(actual, is(instanceOf(String.class)));

not() - 評価の反転(否定)

is()の否定版。
is()と組み合わせて使う。

String expected = "Hello World";
String actual = "こんにちは世界";
assertThat(actual, is(not(expected)));

nullValue() - nullであることの検証

オーバーロードの関係上、is(null)とはできない。
よってnull検証専用で存在する。

String actual = null;
assertThat(actual, is(nullValue()));

notNullValue() - not nullであることの検証

not(nullValue())と同等。

String actual = "Hello World";
assertThat(actual, is(notNullValue()));

equalsTo() - equals()による検証

equals()を用いるので
assertEquals()とほぼ同等の検証を行うことができる。

ただ、is()でショートカットされるので、
直接利用することはほとんど無い。

注意点としては、プリミティブ型。
オートボックシングを前提として、
ラッパー型に引き上げた上で検証を行うことになる。

よって、float型やdouble型など誤差が考えられる場合は注意。
(closeTo()などの他の検証方法はある)

String expected = "Hello World";
String actual = "Hello" + " " + "World";
assertThat(actual, is(equalTo(expected)));

sameInstance() - 「==」による検証

同じインスタンスであるかの検証。

Object expected = new Object();
Object actual = expected;
assertThat(actual, is(sameInstance(expected)));

theInstance() - 「==」による検証(sameInstance()と同等)

sameInstance()と同等。
(存在理由がよくわからない。言い回しの違いか…。)

Object expected = new Object();
Object actual = expected;
assertThat(actual, is(theInstance(expected)));

isA() - instanceOf()のショートカット

短いのでこちらを使いたい。

String actual = "Hello World";
assertThat(actual, isA(Object.class));
assertThat(actual, isA(String.class));

any() - Class.isInstanceOf()による検証(instanceOf()と同等)

instanceOf()と同等。

anyThing()やanyOf()とも全く関係ない。
(JMockのスタイルに合わせるものとして存在…?)

String actual = "Hello World";
assertThat(actual, any(Object.class));
assertThat(actual, any(String.class));

instanceOf() - Class.isInstanceOf()による検証

言語仕様のinstanceOfの評価とも同等。

String actual = "Hello World";
assertThat(actual, is(instanceOf(Object.class)));
assertThat(actual, is(instanceOf(String.class)));

anyThing() - 常に評価がtrue

常に評価がtrueになるMatcher。

String actual = "Hello World";
assertThat(actual, is(anything()));

組合せ

allOf() - AND条件

全ての評価がtrueの場合にtrue。

String actual = "Hello World";
assertThat(actual, allOf(startsWith("Hello"), containsString(" "), endsWith("World")));

anyOf() - OR条件

どれか一つの評価がtrueの場合にture。

String actual = "Hello World";
assertThat(actual, anyOf(startsWith("Hello"), startsWith("こんにちは"), startsWith("World")));

both() - 両方正しいかの検証

両方の評価がtrueの場合にtrue。

allOf()でも表現可能。
(2つの評価を強調した表現)

String actual = "Hello World";
assertThat(actual, both(startsWith("Hello")).and(endsWith("World")));

either() - どちらか正しいかの検証

どちらか一方の評価がtrueの場合にture。

anyOf()でも表現可能。
(2つの評価を強調した表現)

String actual = "Hello World";
assertThat(actual, either(startsWith("Hello")).or(startsWith("こんにちは")));

PR