日々常々

ふつうのプログラマがあたりまえにしたいこと。

assertThatのMatcherとHamcrest

JUnit API探訪:Assertクラス/assertThatメソッド - Shinya’s Daily Report

人のブログに乗っかってなんか書くパターン。

そしてこれらとは別にorg.hamcrest.Matchersというクラスも存在。これが一番提供メソッドも多いようなので今回はこちらのクラスメソッド群について色々写経しつつ、機能・概要を把握して行く事にする。(※このライブラリに関するJavadoc APIを見たほうが手っ取り早いと思ったんだけど、サイト経由では公開されてるJavadoc APIは確認出来ず。何でだろ?)

http://d.hatena.ne.jp/absj31/20120811/1344759958

HamcrestのJavadoc、無いんですよねー。なのでどっちか。

  1. zipでおk
  2. 最新が欲しい

でもさ

でもさ。たいした事書いて無いの。例えば org.hamcrest.collection.IsIn#in(T[] elements) だとこう。うん、そりゃそうだろー、ってね。

Creates a matcher that matches when the examined object is found within the specified collection.
For example:

assertThat("foo", is(in(Arrays.asList("bar", "foo"))))

そんなわけで、別にJavadocいらないんじゃに?と思ったりもしてます。どんなのがあるか記憶の片隅に引っ掛けておけば良い程度ですし、「一覧としてみたい」って用途はあると思うけど、パッケージ構成わかりやすい*1し、IDEでjar開いて事足りるような。

逆に、Javadoc見ないと使い方わからないようなのって、assertThatに使うには向いてないってことでは無いだろうか?とかなんとか。

あと

あと、Matcherは作るものです(キリッ。車輪発明するのたのしいいぃぃぃ………じゃなく、いやそれもあるんですけど、それだけじゃないです。
Matcherを作ると「どうやって検証するか」とセットで「失敗時にどう出すか」を考えるようになります。これはテスト書くのに良い影響を与える!……と思う。たぶん。

ついでに

ついでに。JUnitとHamcrestは切っても切れない関係になっております。無かったらassertThatでisも使えないですからね。だから普通の(?)JUnitにはHamcrest入ってたりします。入ってはいるんですが、そんな新しいバージョンじゃなくて1.1が入っております。ちょっと古い。ちょっと古いから、あんまいいMatcherが揃ってなかったりする。だから自分で新しいhamcrestを使うようにしなきゃいけない。
で、junitにはhamcrestとか入ってないのも用意されていて、jarのファイル名で見分けがつくようになってます。入ってるのは junit だけで、入ってないのは -dep ってついてます。

hamcrestを自前で用意する場合は、junit-depの方を使いましょう。複数バージョンのhamcrestが混在して、不思議なエラーが起こる事もございます。具体的には
ってことで、Gradleでこんな風に書けば良いんじゃないでしょうか。

dependencies {
	testCompile 'junit:junit-dep:4.10'
	testCompile 'org.hamcrest:hamcrest-all:1.3'
}

hamcrest-xxxって幾つかあって、allが生理的に嫌とかなら、とりあえずcoreとlibraryがあれば良いと思います。*2

まとめ

JUnitかわいいよ

昔かいた似たようなエントリ

*1:org.hamcrest.collection とか org.hamcrest.xml とか

*2:と言うかintegrationとかgeneratorとかってなんだろう?EasyMock2Matchersとかなんか夢が広がりそうなもんが見えるんだけど。