以编程方式在单元测试中调用gradle任务图

Gar*_*vis 12 gradle gradle-custom-plugin

我正在为gradle编写一个自定义插件,作为单元测试的一部分,我想调用我的任务,但在此之前执行必备任务.

不幸的是,实际的插件是一个内部项目,所以我无法确定确切的来源,但我已经准备了一个单元测试来演示这个问题:

package toy

import org.gradle.api.Project
import org.gradle.testfixtures.ProjectBuilder
import org.junit.Test

class ToyTasksTest {

    boolean task1Run = false
    boolean task2Run = false

    @Test
    public void taskDependencies(){


        Project p = ProjectBuilder.builder().build()

        p.task("task1") << {
            p.logger.info("task1 running")
            task1Run = true
        }

        def task2 = p.task("task2", dependsOn: 'task1') << {
            p.logger.info("task2 running")
            task2Run = true
        }
        task2.execute() // <--- what magic do I need here instead of .execute()

        assert task2Run == true
        assert task1Run == true
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Assertion failed: 

assert task2Run == true
       |        |
       false    false
Run Code Online (Sandbox Code Playgroud)

如果您想快速运行测试,该项目可在github获得.

另一种说法而不是写作:

task2.execute()
Run Code Online (Sandbox Code Playgroud)

我想要运行相当于:

gradle task2
Run Code Online (Sandbox Code Playgroud)

在单元测试中.

erd*_*rdi 7

在我看来,你想要获得的更多的是集成测试,而不是单元测试.Gradle团队成员过去曾向我建议,在编写插件和任务时,您要做的就是尽可能多地将您的任务分离到POJO和单元测试中.对于Gradle为您和管道工作所做的其他事情,比如执行任务图,测试增量任务功能等等,您可能希望进行明确较慢的集成测试,这就是您希望尽可能进行单元测试的原因.

唯一的问题是Gradle目前没有提供用于编写​​这些集成测试的工具集.有一个设计规范,但目前你仍然需要手工制作解决方案,如果你需要.

你可以看看我在这里使用的那个,但请记住它有一些类路径问题,这就是为什么这一行是必要的.

可以在此处找到使用GradleConnector和我最近找到的其他解决方案的示例.