menu
書いてる野郎
orebike@gmail.com
複雑な構造のクラスの値の検証を行うのは面倒なので、比較するため専用のmatcherを作ることができる。
つまり
assertThat(aaa, is(hoge(bbb)));
hogeを新たに作ってaaaがbbbの条件を満たしているかをチェックできるようになる。
今回はidというメンバを持つHogeクラスのリストがあったとして、 そのリストに指定した前idが揃っているかを検証する。
ということで↓完成品
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; import aaa.bbb.ccc.Hoge; public class WholeSet extends BaseMatcher<List<Hoge>>{ private List<Long> idList; public WholeSet(long[] ids){ this.idList = new ArrayList<Long>(); for(long id : ids){ idList.add(id); } } @SuppressWarnings("unchecked") @Override public boolean matches(Object actual){ List<Hoge> acturalList = (List<Hoge>) actual; if(this.idList.size() != acturalList.size()){ return false; } Set<Long> s = new HashSet<Long>(); for(Hoge h : acturalList){ s.add(h.id); } for(Long id : this.idList){ if(s.contains(id)){ continue; } return false; } return true; } @Override public void describeTo(Description description){ // TODO Auto-generated method stub } public static Matcher<List<Hoge>> wholeSetOf(long... ids){ return new WholeSet(ids); } }
まずクラスを作る名前は適当でBaseMatcherクラスを継承する。
public class WholeSet extends BaseMatcher<List<Hoge>>{
BaseMatcherクラスは型情報を取るのでここに検証したい対象の型を指定する。 今回はHogeクラスのListを検証したいのでそのように指定する。
次にクラスのコンストラクタを作成する。idの配列を取って、内部のリストに格納する。 このidの配列が検証の条件となる想定。
次にmatchesメソッドの実装を行う。 このメソッドが検証のメインとなり、trueを返せば成功、falseを返せば失敗と判定される。
メソッドはObjec型のパラメータを受ける。これは検証の際に
assertThat(aaa, is(hoge(bbb)));
と書いて、検証する対象、aaa
そのものである。
なのでその対象とコンストラクタで受けた条件を使って検証する。
次にdescribeToメソッドを実装する。名前の通り失敗の説明をするためのメソッド。 特に空っぽでも処理はしてくれるので今回はほっとく
最後に使いやすいようにカスタムmatcherを発生させる静的メソッドをくっつける。これで・・・
assertThat(hogeList, is(wholeSetOf(2, 4, 6)));
のようにして検証できるようになる