此错误的原因是什么,如何解决?
乍一看,这似乎是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() {
...
}
}
关键字。
答案 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 /在我看来,如果您的特征表明该方法(在此处设置)是私有的,则您无法在已实现的方法上使用公共方法。