よせばいいのに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のプラグインがあるので,ご覧の通り動かす事はできる(だからどうした程度だけど).