Programmatically invoke a gradle task graph in a unit test

gradle, gradle-custom-plugin

Solution

It seems to me that what you are trying to get here is more of an integration test than a unit test. It was suggested to me in the past by Gradle team members that when writing plugins and task what you want to do is to separate as much as you can/makes sense from your task into POJO and unit test that. For everything else that Gradle does for you and the plumbing, like executing task graph, testing incremental task features and so on you probably want to have integration tests which definitely are slower, that's why you want to unit test as much as possible.

The only problem is that Gradle currently doesn't provide a toolset for writing those integration tests. There is a design spec for that but currently you still have to hand craft a solution if you need one.

You can have a look the one that I using here but keep in mind that it has some classpath issues, that's why this line is necessary.

An example of the other solution that is using GradleConnector and that I found recently can be found here.

Problem

I am in the process of writing a custom plugin for gradle and as part of the unit testing I would like to invoke my task but in such away as it's prerequisite tasks are executed. The actual plugin is unfortunately an internal project so I can't sure the exact source, but I have prepared a unit test that demonstrates the problem: ``` 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 } } ``` The output is: ``` Assertion failed: assert task2Run == true | | false false ``` The project is available on github if you would like to quickly run the test. Another way of saying this instead of writing: ``` task2.execute() ``` I'd like run the equivalent of: ``` gradle task2 ``` In the unit test.

Original source