はじめに

前回、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
}

これを走らせると、テストが成功する。

何が起こっているのかわからないけれども、おそらくクラスからインタフェースを自動生成しているのかな?とりあえず、便利になった。

コードは以下です。

今日はここまで。