LoginSignup
5
5

More than 5 years have passed since last update.

Groovyで引数ありのメソッドを引数なしで呼べる?

Posted at

ちょっとハマったのでメモ。タイトルの通りだけど。
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"
    }
}

としてみると、下記のように落ちる。

Screen Shot 2016-03-28 at 22.25.52.png

引数なしで呼んだものはnullが入る。

テスト結果から見てわかったけど、引数なしで呼ぶと引数のところはnullが入るのね。
ちなみにコンソールでは、

org.spockframework.runtime.SpockComparisonFailure at SampleSpec.groovy:13

ってな感じのエラーになる。一応コンパイルエラー扱い?となっている。

類似事例

しらべてみたところ、同じような問題に言及しているブログ見つけた。

Groovy gotcha: Passing zero arguments to a method that expects one

コメントとかまで見ていると、もしnullがnothingってことなら、引数なし呼び出しと引数にnull渡して呼ぶのは等価だね。 みたいな話が出てる。

油断すると気づかずにいそうだったので、シグニチャ変更するときは気をつけましょう。

5
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5