読者です 読者をやめる 読者になる 読者になる

GeekFactory

int128.hatenablog.com

Java 8でSpockのモック生成がエラーになる件

Java 8でSpockを使ってJavaクラスのモックを作成しようとしたらエラーが出ました。 Groovyクラスのモックではエラーは出ません。

class ExampleSpec extends Specification {
    def "shell should write stdout to #logging"() {
        given:
        def out = System.out
        System.out = Mock(PrintStream)

        when:
        //...

        then:
        System.out.println('some message')

        cleanup:
        System.out = out
    }
}
java.lang.IllegalArgumentException
    at net.sf.cglib.proxy.BridgeMethodResolver.resolveAll(BridgeMethodResolver.java:61)
    at net.sf.cglib.proxy.Enhancer.emitMethods(Enhancer.java:911)
    at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:498)
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
    at org.spockframework.mock.runtime.ProxyBasedMockFactory$CglibMockFactory.createMock(ProxyBasedMockFactory.java:91)
    at org.spockframework.mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:49)
    at org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:51)
    at org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java:44)
    at org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:47)
    at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:282)
    at org.spockframework.lang.SpecInternals.MockImpl(SpecInternals.java:99)

どうやらCGLIBがJava 8に対応していないことが原因のようです。 気長に対応版を待ちましょうか。

https://groups.google.com/forum/#!topic/spockframework/59WIHGgcSNE

確認した環境:

  • JDK 8u25
  • Groovy 2.3.6