Playframework1.2上でGroovy/Spockによるテストを行いたいのだが... #play_ja

ベースになるコンセプトとしては『Playframework1.2に関わるテストコード記述の部分を、Groovy/G*環境で書きたい』になるのですが。

  1. Playframework1.2上で実行出来る『単体テスト』にあたる部分を、Java→Groovyで置き換えて(テスト機構上で)動かしたい
  2. Playframework1.2にSpockを組み込み、BDD周りのテストコードを(テスト機構上で)動かしたい
  3. JUnit with Groovy, Spock共にJenkinsから自動実行、レポート出力まで行う
  4. 動作環境
    • Playframework1.2.5
    • JDK7
    • Groovy1.8.x
    • Spock1.x

今現在、軽〜く試してみた程度なのですが、状況としてはこんな感じです。

  • プロジェクト上で動かす分にはGroovyもSpockも大丈夫なはず
    • でもやりたいのはPlayframeworkでのテスト機構上で動かす事
  • Play1.2.5プロジェクト作成→Eclipseに取り込み
  • Eclipse Groovy Plugin導入
  • Eclipse上でテストコード作成、実行(extends play.test.UnitTest)→エラー
import static org.hamcrest.CoreMatchers.is;
import org.junit.Test;
import play.test.UnitTest;

class GroovyTest extends UnitTest {
	@Test
	public void testGroovy() {
		assertThat(3 + 7,is(10));
	}
}
java.lang.NullPointerException
	at org.junit.runners.model.TestClass.isANonStaticInnerClass(TestClass.java:157)
	at org.junit.runners.BlockJUnit4ClassRunner.validateNoNonStaticInnerClass(BlockJUnit4ClassRunner.java:107)
	at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.validate(ParentRunner.java:344)
	at org.junit.runners.ParentRunner.<init>(ParentRunner.java:74)
	at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55)
	at org.junit.runners.JUnit4.<init>(JUnit4.java:20)
	at play.test.PlayJUnitRunner.<init>(PlayJUnitRunner.java:39)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
	at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
	at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
	at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    • この部分、テストクラスに【play.test.UnitTestクラス】を拡張させていて、Groovyクラスから単純にUnitTestクラスを拡張させただけでは動かない
    • この辺解決すればGroovyでも行けるのかな?でもどうやって...(現在ココ)

出来るもんなのかしら?以下に挙げた実現度のうち、勿論高い方が良いのだけれど…。必要最低限の対応で出来る事が望ましいけれど、手段・解決方法によってはその辺応相談な感じで。

JUnit4 with Java
(Playframework
テスト機構組込済)
JUnit4 with GroovySpock備考
1.○(利用可能)○(実現可能)○(実現可能)Playframework1.2の機構上で
Java/Groovy/Spock
全て問題無く動かせる
2.○(利用可能)○(実現可能)×(実現不可)JUnit with Groovyについては対応可能に
3.○(利用可能)×(実現不可)○(実現可能)Spockについては対応可能に
4.○(利用可能)×(実現不可)×(実現不可)Playframework1.2のテスト機構を素直にそのまま使う
(=今回の件は諦める...(つд`))


流れとしては、以下のエントリでかじ(TwitterID:@kaji_3)さんがやっている事に近いかな。@kaji_3さんも同様にPlayframework/Spockに関する部分は未検証のようです。


また、Playframeworkで提供しているモジュールの中に、Spockに関するものがあるにはあるが…これどうやって組み込むんだ?(他のと比較してみても)そもそもこれリリースされてるのかな?


つーか、Playframeworkのテストに関するドキュメントって公式の他にはそんなに無いもんなのかしら?ちょっとこの辺も調べてみたい。


個人的に興味深い切り口の当エントリですが、実現可能性がまだ見えてこないので以下2点に関する深堀りはひとまずは別々に進めて行くのが良さげなのかな〜。

  • Playframeworkにおけるテスト(Java)
  • JUnit with Groovy, Spock(Groovy, G*)


このエントリをご覧になった方で『出来るよ/出来ないよ』『こうすれば出来るよ』と言った情報を教えて頂けると非常に助かります&とても嬉しいです。