Spock 2.0 的具体模拟 class 失败

Mocking of concrete class failing with Spock 2.0

模拟外部混凝土 class 失败并出现以下错误。

java.lang.AbstractMethodError: Receiver class me.spike.LibraryTest does not define or inherit an implementation of the resolved method 'abstract java.lang.Object getProperty(java.lang.String)' of interface groovy.lang.GroovyObject.

我已经尝试添加 cglibs-nodep 和 objenesis,但未能成功模拟具体的 class。

这里提到的存储库有一个失败的测试。测试本身是荒谬的。目的是让模拟工作。

MCVE - https://github.com/ajaydivakaran/spock_spike

虽然这只是一种解决方法,但您可以切换到 gmavenplus 来处理 Groovy 编译而不是 groovy-eclipse-compiler,然后测试通过:

            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>1.8.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compileTests</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-all</artifactId>
                        <version>2.5.11</version>
                        <scope>runtime</scope>
                        <type>pom</type>
                    </dependency>
                </dependencies>
            </plugin>

这似乎肯定与 Groovy Eclipse 编译器相关。我们不使用 GEC 测试 Spock,它也不受官方支持。该测试在 Spock 1.3-groovy-2.5(和 GEC)中也失败了,因此它不是 2.0 中的回归。但是,可能与JavaMockInterceptor and some issues with Groovy 3 - #1076中的"hacks"有关。

你可以在Spock issue tracker里举报,但是不知道能不能妥善处理

就像我在另一个问题中所说的那样,您应该摆脱 Build Helper 插件,因为 Maven 会自动识别您的 src/test/groovy - 至少,只要您的 src/test/java 不是完全空的.此外,Surefire 插件是过度指定的,就像我之前也告诉过你的那样。您应该保持构建文件较小,并且只包含需要的内容。

但真正的问题是您的 Groovy Eclipse 批处理编译器是 3.0.3 版,而您使用 Groovy 2.5.11 版。只需降级该依赖项以适合您的 Groovy 版本,您的测试就会正常运行。或者走另一条路,将 Groovy 和 Spock 升级到 3.0。无论如何,更改此行可以修复您的构建:

<groovy-eclipse-batch.version>2.5.11-01</groovy-eclipse-batch.version>