在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修饰符封装您的方法。

09-03 20:30