Spock試してみた。
id:lam_bdaが最近BDDにご執心なようなのでノリと勢いでBDDいんじゃね?とか言った自分も試してみた。
使ったのはspockというgroovyで書けるTestFramework。easybよりも覚えること少なくて良さげな感じ。
とりあえずもっこすしてみる
まずSpockでstoryを作る。id:lam_bdaがやってたBehavior形式ではなくStory形式ね。
import org.junit.runner.RunWith import spock.lang.*; @Speck @RunWith(Sputnik) public class MokkosSpeck{ def "もっこすに「こんにちは」と喋らせると語尾に「もっこす」が付く"() { given: "喋らせる言葉は「こんにちは」" when: "喋らせた時" then: "もっこすが喋った言葉には語尾に「もっこす」が付いているはず" } }
んで、Javaで実装を書いてみる。
public class Mokkos { public String say(String toSay) { return toSay + "もっこす"; } }
って訳で、storyを実装してみる。
import org.junit.runner.RunWith import spock.lang.*; @Speck @RunWith(Sputnik) public class MokkosSpeck{ def mokkos = new Mokkos() def "もっこすに「こんにちは」と喋らせると語尾に「もっこす」が付く"() { given: "喋らせたい言葉は「こんにちは」" def word = "こんにちは" when: "喋らせた時" def mokkosWorld = mokkos.say(word) then: "もっこすが喋った言葉には語尾に「もっこす」が付いているはず" mokkosWorld == "こんにちはもっこす" } }
で、mvn testで実行。まぁ、普通に通る。でもRSpecと違ってラベルはテスト実行時に出力されないっていうか、何も出力されないので今一つ面白くないけども。因みにpomの設定は本家参照
感想
凄い書きやすい。というかBDDいいな。いつもUnitTest書く時に結構前提条件が抜けたり、異常系にまで頭が回りにくかったりするのだけど、こういう書き方だと「自然」と考えざるを得ないというか、テストの仕方、作り方に考えがいく。実装を書かずにこれでSpec的なものをつらつら書いていくのはいいかもしれない。
因みに、UTF-8で.groovyを書くとコンパイルが通らない。MS932で書くと通るのになんでだろうなぁ。sourceEncodingオプションにUTF-8渡したり色々試してみたけどだめ。groovy-consoleでは問題なく動かせるのにな。gmaven-pluginが悪いんだろか。