如何在单元测试中 运行 我的自定义 gradle 任务?

How can I run my custom gradle task in the unit test?

我需要 运行 我的 gradle 任务来测试单元测试中的基本功能:

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

public class IwillfailyouPluginTest {
    @Test
    public void applyPlugin() {
        final Project project = ProjectBuilder.builder().build();
        project.getPlugins().apply(IwillfailyouPlugin.class);
        project.task("iwillfailyou").// what method should I run?
    }
}

但是我找不到运行的方法。请帮助我

我的理解是ProjectBuilder更适合类单元测试。因此,对于您所拥有的,您应该只断言名为 iwillfailyou 的任务存在,属于某种类型,并且具有正确的配置。

public class IwillfailyouPluginTest {

    @Test
    public void applyPlugin() {
        final Project project = ProjectBuilder.builder().build();
        project.getPlugins().apply(IwillfailyouPlugin.class);

        assertTrue(project.getTasks().getNames().contains("iwillfailyou"));

        MyCustomTaskType iwillfailyou = project.getTasks().getByName("iwillfailyou");

        assertEquals(123, iwillfailyou.getSomeConfig())
    }

}

看起来您正在尝试测试自定义任务的 behavior/function。对于那种测试,您可以使用 TestKit.

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.io.FileWriter;
import java.nio.file.Files;

import org.gradle.testkit.runner.GradleRunner;
import org.gradle.testkit.runner.BuildResult;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;


class IwillfailyouPluginFunctionalTest {

    @Test
    void canRunTask() throws IOException {
        // Setup the test build
        File projectDir = new File("build/functionalTest");
        Files.createDirectories(projectDir.toPath());
        writeString(new File(projectDir, "settings.gradle"), "");
        writeString(new File(projectDir, "build.gradle"), "plugins {" + "  id('i.will.fail.you')" + "}");

        // Run the build
        GradleRunner runner = GradleRunner.create();
        runner.forwardOutput();
        runner.withPluginClasspath();
        runner.withArguments("iwillfailyou");
        runner.withProjectDir(projectDir);
        BuildResult result = runner.build();

        // Verify the result
        Assertions.assertTrue(result.getOutput().contains("someoutput from the iwillfailyou task"));
    }

    private void writeString(File file, String string) throws IOException {
        try (Writer writer = new FileWriter(file)) {
            writer.write(string);
        }
    }
}