Edited at

Java 8 でモックを作るさいの注意メモ。

More than 3 years have passed since last update.

自分の場合は Java 8 & Spock でぶち当たった問題だけれど、元をたどると cglib というモック時にバイトコードをごにょごにょするライブラリに問題があった。

cglib というと Mockito、EasyMock や PowerMock でも使われているので、それなりのインパクトがあると思う。


結論

Maven レポジトリ上だと、Spock 1.0 (Groovy 2.4) は cglib 3.1 にオプショナルで依存しているけど、Java 8 でモック機能を使いたいなら 3.2 を使わないとダメっぽい。


経緯

Spock 1.0 (Groovy 2.4) と cglib 3.1 をMavenで導入し、よし何かテスト書いてやろうと思ったら、モックの際に IllegalArgumentException が出てしまった:


HelloMySpec.groovy

import spock.lang.Specification

class HelloMySpec extends Specification {
def "test description"() {
setup:
def mock = Mock(SomeClass) // <-- こ奴が問題

expect:
name.size() == length

where:
name | length
"Spock" | 5
}
}


以下の様な例外:

java.lang.IllegalArgumentException

at net.sf.cglib.proxy.BridgeMethodResolver.resolveAll(BridgeMethodResolver.java:61)

ググってみると、Spock のイシュートラッカーに cglib 3.2 を使ってみたら治ったよ、という書き込みがあったので、従ってみたところ見事解決。