自分の場合は 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 を使ってみたら治ったよ、という書き込みがあったので、従ってみたところ見事解決。