はじめに
前回、spockの mock 機能を利用するために、interfaceを用意していた。
というのも、interfaceからでないとMockを作成できないと思っていたからだ。
しかし、interfaceを用意しなくても、classからモックを作成できることがわかったので、紹介。
byte-buddy
class からモックを作ろうとすると、以下のようなエラーがでる。
org.spockframework.mock.CannotCreateMockException:Cannot create mock for class sample.Calculator. Mocking of non-interface types requires a code generation library. Please put byte-buddy-1.6.4 or cglib-nodep-3.2 or higher on the class path.
注目すべきは、Please put byte-buddy-1.6.4 or cglib-nodep-3.2 or higher on the class path.
なんだ、byte-buddyとは?ということで、検索。
どうやら、コードを自動生成するようなライブラリらしい。早速インストール。gradleをつかっているので、以下を build.gradleのdependencies
に追加。他のビルドツールでの追加方法は、byte-buddyのサイトを参照してください。
testRuntime "net.bytebuddy:byte-buddy:1.7.5"
すると、interfaceを実装していないクラスからでもMockがつくれた!
実列
以下のクラスのモックを作る。
class Calculator {
int add(int a, int b) {
return a + b
}
}
テストコードは以下。
def "interfaceなしでMockをつくる" () {
setup:
def calc = Mock(Calculator)
calc.add(_, _) >> 4
expect:
calc.add(1,2) == 4
}
これを走らせると、テストが成功する。
何が起こっているのかわからないけれども、おそらくクラスからインタフェースを自動生成しているのかな?とりあえず、便利になった。
コードは以下です。
今日はここまで。