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
上書きできました。