编译器说,公共常规方法必须是公共的

时间:2019-06-05 16:04:12

标签: groovy traits spock grails-3.3 groovy-2.4

此错误的原因是什么,如何解决?

乍一看,这似乎是groovy编译器中的缺陷。

<Directory "/home/ctm/example.com/public/">
     AllowOverride All
     Require all granted
</Directory>

我的grails集成测试如下:

:compileIntegrationTestGroovystartup failed:
C:\src\my-project\src\integration-test\groovy\my\project\MyServiceISpec.groovy: 31: The method setup should be public as it implements the corresponding method from interface my.project.MyTrait
. At [31:5]  @ line 31, column 5.
       public void setup() {
       ^

1 error

我的特质看起来像这样:

@Integration
@Rollback
class MyServiceISpec extends Specification implements MyTrait {
    @Autowired
    MyService service

    OtherService otherService = Mock()

    public void setup() {
        myTraithMethod()
        service.otherService = otherService
    }
}

更新为特征设置方法添加了trait MyTrait { public void setup() { myTraithMethod() } private myTraitMethod() { ... } } 关键字。

2 个答案:

答案 0 :(得分:3)

我认为问题的根源是AST,因为Spock使用AST转换并编译规范。您可以在这里http://docs.groovy-lang.org/next/html/documentation/core-traits.html#_compatibility_with_ast_transformations阅读以下内容:

  

特质与AST转换未正式兼容。一些   它们,例如@CompileStatic将应用于特征本身(而不是   实施类),而其他将同时应用于   实现阶级和特质。绝对不能保证   AST转换将像常规一样在特征上运行   上课,使用它需要您自担风险!

例如,您可以通过在setup()的特征中重命名traitSetup()方法并从规范setup()方法中调用它来解决此问题,例如:

@Integration
@Rollback
class MyServiceISpec extends Specification implements MyTrait {
    @Autowired
    MyService service
    OtherService otherService = Mock()

    void setup() {
        service.otherService = otherService
        traitSetup()
    }

    def 'some test here'() {
        ...
    }
}

trait MyTrait {
    void traitSetup() {
        myTraitMethod()
    }

    private myTraitMethod() {
        ...
    }
}

答案 1 :(得分:0)

1 /不确定,但是特征名称是ResetsDatabase,并且您的测试实现了MyTrait。 可能有一些特质混杂? 2 /在我看来,如果您的特征表明该方法(在此处设置)是私有的,则您无法在已实现的方法上使用公共方法。