JUnit4 の Parametrized を Groovy で使う

概略

現在こっそり開発しているツールのテストに Groovy を使用しています. テスト対象は Java なのですが, テストには柔軟に書ける Groovy が便利です.

プロジェクト自体は Maven3 で管理していて, ビルド, テスト, パッケージングを全て pom.xml で設定しています. そこのちょっとした設定の間違いで数時間ハマってしまったので, 記録として残しておきます.

Groovy テストスクリプト

JUnit4 ではパラメータ化されたテストを実行することができます.

クラスに org.junit.runner.RunWith アノテーション, パラメータを供給するメソッドに org.junit.runners.Parameterized.Parameters アノテーションを付けると, そのクラスはパラメータ化されたテストを実行できるようになります.

詳しいことは http://groovy.codehaus.org/Using+JUnit+4+with+Groovy あたりを見てください.

pom.xml

pom をそのまま書くのが面倒なので,

<aaa>
  <bbb>
    <ccc>value</ccc>
  </bbb>
</aaa>

というのを

aaa
`-bbb
    `-ccc=value

と書くことにします.

プロジェクトの build 要素以下はこのようになっています.

build
`-plugins
  `-plugin
    `-groupId=org.codehaus.gmaven
    `-artifactId=gmaven-plugin
    `-version=1.4
    `-configuration
    | `-providerSelection=1.8
    `-executions
    | `-execution
    |   `-goals
    |     `-goal=generateStubs
    |     `-goal=compile
    |     `-goal=generateTestStubs
    |     `-goal=testCompile
    `-dependencies
      `-dependency
        `-groupId=org.codehaus.groovy
        `-artifactId=groovy-all
        `-version=1.8

この pom で mvn clean test を実行すると以下のようなエラーが出ました.

シンボルを見つけられません。
シンボル: クラス Parameterized$Parameters
場所    : org.junit.runners の パッケージ

Groovy で書いたテストスクリプトが Java クラスに変換され, さらに javac でコンパイルされます. その段階で上のエラーが出ています.

確かに Groovy から変換された Java ソースを見ると @Parameter アノテーションが @org.junit.runners.Parametrized$Parameter に変換されてしまっています. Java ソースとしては $ ではなく . が正しいはずなのでコンパイルエラーが出た理由が分かりました.

しかし, いくらググってもこの Groovy スクリプトのマズいところが見付かりません.

ふと思い立って goal=generateTestStubs の部分を消してみました. 「変な Java ソースを生成するくらいなら, そこを消してしまえ」と, 思い立ったというよりヤケクソでというのが正しい表現な気もします. すると無事テストが実行されました.

なぜかと考えてみると, そもそも generateTestStubs で生成された Java ソースは, メソッドの本体が return null のような意味の無いクラスでまさにスタブでした. なぜこのようなクラスが必要になるのかと言うと, おそらく Java 側からこの Groovy スクリプトを呼び出すコードをコンパイルするためのクラスなのでしょう. 今回, そのような Java クラスは無いので実はこのゴールは不要なのでした.

まとめ

ということで答えは「余計なゴールがあったために, 変な Java ソースをコンパイルしなくてはならなくなり, そこでエラーが起きていた」ということでした.

う〜ん, 我ながら嫌なハマり方をしましたが, 解決できたときはスッキリしました.

そして教訓は「ツールについてきちんと理解しよう」ということでした. maven は便利なツールですが, まだ自分にとって複雑なツールです. まだまだ勉強しないとですね.

それでは.

test

comment test

Licenses