Groovy の Mock で遊ぶ

The Groovy programming language - 404

Groovy Mocks を読んでみたのでメモです。
メモなので、特に結論などはありません。

上で紹介されていたシンプルな mock で遊んでみました。
本当にお手軽に mock ができてびっくり。

interface クラスの mock が紹介されていますが、通常のクラスでもいけたので、とりあえずそれでやってみました。

まずは、こんなクラス。
文字列を表示するメソッドが一つだけです。
mock で表示文字列を変更しています。

class MockClass {
    def methode1() {println "Hello World"} 
}

def mock=[methode1:{println "Hello Groovy"}] as MockClass

mock.methode1()
Hello Groovy


数値を返すメソッドを追加。
mock では、そのメソッドを定義していません。(定義を忘れただけ)

class MockClass {
    def methode1() {println "Hello World"}
    def methode2() {10} 
}

def mock=[methode1:{println "Hello Groovy"}] as MockClass

println mock.methode2()
10

呼べちゃいました。

2つ目のメソッドの返す値を、mock で変えてみます。

class MockClass {
    def methode1() {println "Hello World"}
    def methode2() {10} 
}

def mock=[methode1:{println "Hello Groovy"}, methode2:{100}] as MockClass

println mock.methode2()
100


続いて、数値を返すメソッドの内容を、文字列を表示するように変更してみます。

class MockClass {
    def methode1() {println "Hello World"}
    def methode2() {10} 
}

def mock=[methode1:{println "Hello Groovy"}, methode2:{println 100}] as MockClass

mock.methode2()
100


戻り値を int にして、再度実行。

class MockClass {
    def methode1() {println "Hello World"}
    int methode2() {10} 
}

def mock=[methode1:{println "Hello Groovy"}, methode2:{println 100}] as MockClass

mock.methode2()

例外発生...
さすがにシグネチャは合ってないとね。


int の引数を 2 つ取って、加算結果を返すメソッドを追加します。
mock で加算を乗算に変更しています。

class MockClass {
    def methode1() {println "Hello World"}
    def methode2() {10}
    def methode3(int a, int b) {a+b}
}

def mock=[methode1:{println "Hello Groovy"}, methode2:{println 100}, methode3:{a,b -> a*b}] as MockClass

println mock.methode3(3, 4)
12


メソッドを static にしてみます。

class MockClass {
    def methode1() {println "Hello World"}
    def methode2() {10}
    static def methode3(int a, int b) {a+b}
}

def mock=[methode1:{println "Hello Groovy"}, methode2:{println 100}, methode3:{a,b -> a*b}] as MockClass

println mock.methode3(3, 4)

上書きされません。

7

フィールド変数を追加してみます。

class MockClass {
    def a = 9
    def methode1() {println "Hello World"}
    def methode2() {10}
    static def methode3(int a, int b) {a+b}
}

def mock=[methode1:{println "Hello Groovy"}, methode2:{println 100}, methode3:{a,b -> a*b}, a:99] as MockClass

println mock.a
9

あれ?

ちょっと考えて解決。
フィールド変数には、自動的に getter が生成されるので、mock にもその名前でメソッドを定義します。

class MockClass {
    def a = 9
    def methode1() {println "Hello World"}
    def methode2() {10}
    static def methode3(int a, int b) {a+b}
}

def mock=[methode1:{println "Hello Groovy"}, methode2:{println 100}, methode3:{a,b -> a*b}, getA:{99}] as MockClass

println mock.a
99

上書きできました。