よせばいいのにBDDにも手を出してみる
「スはスベックのス」を読みかじったくらいで,BDDに手を出すとは,どんなミーハーだ?
RubyにあるならJavaにもあるだろうと調べたところ,この2つが見つかったよ.
JDave/JBehave
ちらっと使った限りでは,JDaveのほうが完成度が高そう(というか,JBehaveはドキュメントが少な過ぎで,使うところまでたどり着けなかった).テストコード(仕様)の記述性...というかexpectationsの可読性は,良さげなんだけど,JUnitに取って代われるかつうと,まあムリだろなって感じ.
#JUnit以上に大衆受けしないって意味で.
そんでも,JUnitにも転用できそうな技術はちらほら見つかったので,あたしの抽き出しのひとつにさせてもらう.:-P
JDave
JUnitの@RunWithアノテーションのおかげでJUnitとの相性が良い.ただ,現バージョン(0.9.0)のJDaveRunnerはJUnit4.3をターゲットにしているため,IDEAで使うにはちょっとコツがいる(IDEAはJUnit4.4をバンドル).
@RunWith(JDaveRunner.class) public class JDave_ArrayListSpec extends Specification<List<?>> { public class 空のリスト { private List list; public List create() { list = new ArrayList(); return list; } public void リストは空っぽである() { specify(list, should.be.isEmpty()); } public void 空っぽなので要素にアクセスすると例外が発生する() { specify(new Block() { public void run() throws Throwable { list.get(0); } }, should.raise(IndexOutOfBoundsException.class)); } } }
JDaveのユニークな点は,型パラメータを上手に使ったshould.be
なんだけど,それ以上に,Blockインターフェイスの使い方が気に入りましたよ.これは,JUnitの@Testアノテーション(のexpected属性)より可読性が良いので,なんとかJUnitでも使えるようにしたいところ.
似たような構文で,JBehaveのEnsure.throwsException()ってのがヒントになるんじゃないかと.
ちなみに,IDEAでの実行結果はこう(JUnitのテストランナーが動く).
SpecとContextおよびBehaviorsの名前付けをちょっと工夫すれば,日本語でも違和感無く読めるようにできるんじゃないだろか?
JBehave
Javaではうまく動かせなかったんだけど,どうゆうわけかGroovyで動いた.ただ,JBehaveのコードは,JUnitさほど代わり映えしないんで,わざわざ使う意図が読み取れなかった.:-(
class Groovy_ArrayListBehaviour { private list; void setUp() { list = new ArrayList(); } void shouldIsEmptyは真である() { Ensure.that list.isEmpty() } } class AllBehaviours implements Behaviours { public Class[] getBehaviours() { return [ Groovy_ArrayListBehaviour ]; } }
なんでかIDEAのプラグインがあるので,ご覧の通り動かす事はできる(だからどうした程度だけど).