のえら

技術備忘とかメモとか.間違いはつっこんでいただきたい所存.

Groovyc: unexpected token: } と whereブロック

Spock(Groovy)のテストケースを書いていて、後からwhereブロックを追加したら以下のエラーが出たけど始めなんで怒られているのかわからなかった。

Groovyc: unexpected token: }

書いていたテストはこんな感じ。
API叩いて結果を確認するだけ。

def 'GET: /hoge/list Hogeの一覧を返す'() {
  when:
  // APIリクエスト クロージャ
  def request = {
    // Rest execute
  }
  
  then:
  with(request.call()) {
    it.status == xxx
    it.body == xxx
  }
}

と、シンプルなフィーチャーメソッドを作成して、後から色々なパラメータ与えたくなってwhereを追加した。
パラメータ自体は1種だけ。

def 'GET: /hoge/list Hogeの一覧を返す'() {
  when:
  def request = {
    // Rest execute(params) <-ここにwhereブロックの変数paramsが入る
  }
  
  then:
  with(request.call()) {
    it.status == xxx
    it.body == xxx
  }

  where:
  params || -
  1           || -
  2           || -
  null       || -
}

こんな感じで、データテーブルは1行では認識されないため、最低2列用意しないといけないのはわかっていたので、規約に沿って空白列を追加。
で、追加したところで、前述のエラーメッセージ。
閉じ位置は変えていないのになんでだろ?と思ってよく見直したら、空白列でアンダーバーを記述しなければならない箇所でハイフンを記述していたのでワイルドカードが認識されずにエラーになっていただけという。

正しくはwhereブロックはこうなる。

where:
param || _
1          || _
2          || _
null      || _

ハイフンは変数ではないので当たり前のことなんだけども、ぼーっとしながら書いちゃダメだなと思った。

テーブルデータが1つなら、空白列足すよりパイプ使った方がスッキリするやも。

where:
param << [1, 2, null]


ちなみに、whereブロックを1つだけしか定義しないと以下のエラーメッセージが表示される。めっちゃ丁寧。

Groovyc: where-blocks may only contain parameterizations (e.g. 'salary << [1000, 5000, 9000]; salaryk = salary / 1000')