在Gradle构建的上下文中,我对Groovy方法的可见性感到困惑。
对于项目中的某些测试,我必须首先启动服务器。
为此,我创建了一个自定义任务类,该类扩展了Gradle的Test
,如下所示:
class TestWithServer extends Test {
TestWithServer() {
super()
beforeTest {
startServer()
}
}
private void startServer() {
println('placeholder')
}
}
但是,如果我尝试运行此类任务,则会收到错误消息:
Could not find method startServer() for arguments [] on task ':testWithServer' of type TestWithServer.
我发现,当我将
startServer()
的可见性更改为默认值(公共(public))时,任务运行正常。为什么不能在其自己的类中使用私有(private)方法?
最佳答案
它不是同一类,因为Gradle向任务类型添加了一些魔力。只需将println this.class
添加到beforeTest
闭包中即可查看实际类的名称(类似于TestWithServer_Decorated
)。这个附加的魔术还解释了为什么错误消息中包含任务名称,以及类如何完全知道作为任务(类型)。由于修饰的类是该类的子类,因此可以使用protected
修饰符封装您的方法。