Spockの知られざる機能
僕だけが知らなかったのかもしれません。。。
Spockではテストメソッドに@Unrollとつけると、パラメタライズがテストメソッド名に反映されます。これとっても見やすくてよいです。
こんな感じ。。。
class WhenWatchingUstream extends Specification { @Unroll def "should show #channel when click #channel window"(){ expect: // click channel where: channel << ["Cooking", "Music", "Animation"] } }
にしておくと
ところがです。テストメソッドが大量になってくると、テストメソッドのたびに@Unrollとつけるのが鬱陶しくなります。JUnit4の@Testから逃れたと思ったら、今度は@Unrollがおってくる><
Unrollの定義をみるとだ
ところでUnrollの定義を見ると次のようになっています。
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @ExtensionAnnotation(UnrollExtension.class) public @interface Unroll { String value() default ""; }
つまり、クラス宣言につけられると。つまり、クラスにつけておけばそのクラスのテストメソッドは全てUnrollしたことと一緒になります!!!!(今日初めて知った
つまりこんな感じにできます。
@Unroll class WhenWatchingUstream extends Specification { def "should show #channel when click #channel window"(){ expect: // click channel where: channel << ["Cooking", "Music", "Animation"] } def "should show #sns message when send #sns message"(){ expect: // send sns message where: sns << ["Facebook", "Twitter"] } def "Not Parameterize Feature"(){ when: new Object() then: assert true } }
まとめ
@Unrollはクラス宣言につけましょう。