升级到 2.5.0 后,使用私有方法的 Grails spock 测试失败

Grails spock tests with private methods failing after upgrading to 2.5.0

我们已将我们的应用程序从 Grails 2.4.4 升级到 2.5.0。一切正常,但一些测试用例失败,其中包含一些私有方法。

import org.junit.Before

class UserServiceSpec extends IntegrationSpec {

    @Before
    def setup() {
         // Some initialization
    }

    // being used in other test methods
    private void getParams() {
          // some code
    }

    void testUserUniqueEmali() {
         when: "this runs"
         // code
         then: "hello"
         // code
    }
}

抛出异常:

java.lang.IllegalAccessException: Class org.spockframework.util.ReflectionUtil can not access a member of class com.test.UserServiceSpec with modifiers "private"
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:153)
    at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:84)
    at org.junit.runners.Suite.runChild(Suite.java:128)
    at org.junit.runners.Suite.runChild(Suite.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access[=11=]0(ParentRunner.java:58)
    at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
    at _GrailsTest.run_closure1(_GrailsTest.groovy:102)
    at TestApp.run_closure1(TestApp.groovy:32)

我生成了依赖报告,这里有一些统计数据:

org.spockframework:spock-core:1.0-groovy-2.4
org.codehaus.groovy:groovy-all:2.4.3

这表明正在使用最新版本的 Spock 框架,但我无法解决此问题。我试过删除 "private" 修饰符,但它仍然不起作用。

调查了一段时间,找到了问题所在,但没有找到根本原因。

基本上,@Before 注释是罪魁祸首,由于某种原因,spock 测试抛出了该错误。删除未使用的注释解决了我的问题。

这在 Grails 2.4.4 中有效,但在 2.5.0 中开始失败,可能是因为 Spock 框架发生了变化。

我遇到了同样的问题。为了防止它们,只是不要像 Spock 的方法那样命名用 JUnit 的 @Before@After 注释的方法:cleanup 和 setup。