ちょっとハマったのでメモ。タイトルの通りだけど。
Groovy:2.4.6, Gradle:2.12, Spock:1.0で試しています。
引数つきメソッドが引数なしで呼べる(やりようによってはテストも通る)
Sample.groovy
class Sample {
String say(String message) {
return "Hello!"
}
}
上記のように、引数を1つ取るメソッドが定義されていて
それを下記のように引数なしで呼ぶテストを書いてみる。
SampleSpec.groovy
class SampleSpec extends Specification {
def "引数ありのメソッドに引数なしで呼べる"() {
given:
def sut = new Sample()
when:
def actual = sut.say()
then:
actual == "Hello!"
}
}
Javaならコンパイルエラーになるところだけど、Groovyだと通る。
しかもRedではなくGreenとなる。
テストをRedにしたい場合
たとえば上記のクラスを変更して、
Sample.groovy
class Sample {
String say(String message) {
return "Hello! $message"
}
}
としてみると、下記のように落ちる。

引数なしで呼んだものはnullが入る。
テスト結果から見てわかったけど、引数なしで呼ぶと引数のところはnullが入るのね。
ちなみにコンソールでは、
org.spockframework.runtime.SpockComparisonFailure at SampleSpec.groovy:13
ってな感じのエラーになる。一応コンパイルエラー扱い?となっている。
類似事例
しらべてみたところ、同じような問題に言及しているブログ見つけた。
Groovy gotcha: Passing zero arguments to a method that expects one
コメントとかまで見ていると、もしnullがnothingってことなら、引数なし呼び出しと引数にnull渡して呼ぶのは等価だね。
みたいな話が出てる。
油断すると気づかずにいそうだったので、シグニチャ変更するときは気をつけましょう。