例えば、テストメソッドの中で以下のように振る舞う Matcher が欲しいとする。(文字の大小を無視した包含の判定)
@Test public void testContains() { assertThat("bc", contains("")); assertThat("bc", contains("b")); assertThat("bc", contains("B")); assertThat("bc", contains("c")); assertThat("bc", contains("C")); assertThat("bc", contains("bc")); assertThat("bc", contains("BC")); assertThat("", not(contains("bc"))); assertThat("bc", not(contains("cd"))); assertThat("bc", not(contains("Cd"))); assertThat("bc", not(contains("ab"))); assertThat("bc", not(contains("aB"))); assertThat(null, not(contains("ab"))); assertThat("bc", not(contains(null))); assertThat(null, not(contains(null))); }その場合、Matcher はこう書く。
package xad.junit47.trial1.util; import org.hamcrest.Description; import org.junit.internal.matchers.TypeSafeMatcher; public class ContainsStringIgnoringCase extends TypeSafeMatcher<String> { public static TypeSafeMatcher<String> contains(String criteria) { return new ContainsStringIgnoringCase(criteria); } private final String criteria; public ContainsStringIgnoringCase(String criteria) { this.criteria = criteria; } @Override public void describeTo(Description description) { description.appendText("is contained"); } @Override public boolean matchesSafely(String object) { return null != object && null != criteria && object.toUpperCase().contains(criteria.toUpperCase()); } }カスタム Matcher は jMock でもかなり使う場面が多いので、いろんな述語を書けるように慣れておくと便利。自動生成させるつもりがなければ、@Factory アノテーションはいらない。
ちなみに、出来合いの Matcher の、is() とか anyOf() とか containsString() とかは、org.hamcrest.CoreMatchers か org.junit.matchers.JUnitMatchers のクラスメソッドなので static import しておけば使える(これも結構わかりづらそう)。
0 件のコメント:
コメントを投稿