【问题标题】:Mocking of concrete class failing with Spock 2.0Spock 2.0 模拟混凝土类失败
【发布时间】:2020-05-19 22:44:30
【问题描述】:

外部具体类的模拟失败并出现以下错误。

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,但未能成功模拟具体类。

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

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

【问题讨论】:

  • 提供MCVE 总是很好的,对此表示敬意。但这并不意味着这里的问题应该只是一个链接到 GitHub 的存根。
  • @kriegaex 反馈赞赏。您会建议我在提出的问题中提供哪些其他信息?

标签: maven spock


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    虽然这只是一种解决方法,但您可以切换到 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 Compiler 相关。我们不使用 GEC 测试 Spock,也没有官方支持。 Spock 1.3-groovy-2.5(和 GEC)的测试也失败了,所以它不是 2.0 中的回归。但是,可能与 JavaMockInterceptor 中的“黑客”以及 Groovy 3 - #1076 的一些问题有关。

    你可以在Spock issue tracker举报,不过不知道会不会得到妥善处理。

    【讨论】:

    • 我总是将 Spock 与 Groovy-Eclipse 一起使用,因为它是一个真正的 Maven 编译器插件,而不是用户需要配置以匹配 Maven 生命周期的额外组件。 OP 只是使用了错误的编译器版本。 ;-) Spock 手册或示例项目可以解释如何使用 Groovy-Eclipse。如果您需要样品,请随时与我联系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2017-08-02
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多