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が悪いんだろか。