JUnit4/カスタムmatcherを作る

JUnit4/カスタムmatcherを作る

複雑な構造のクラスの値の検証を行うのは面倒なので、比較するため専用の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)));

のようにして検証できるようになる

タグ

java/junit4/making_custom_matcher.txt · 最終更新: 2013-03-09 18:48 by ore