首页 > 解决方案 > 如何在同一个示例项目中使用 JUnit 和手动测试自定义 gradle 插件

问题描述

我的目标是设置这个项目:

example-gradle-plugin
├── build.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com ....
    └── test
        ├── java
        │   └── example
        │       └── integrationtest
        │           │ # GradleRunner.create().withProjectDir(testProjectPath.toFile()).withPluginClasspath()
        │           └── SimpleProjectRegressionTest.java // 
        └── resources
            └── simple
                │   # plugins { id "example-gradle-plugin" }
                ├── build.gradle 
                │   # // includeBuild ../../../../example-gradle-plugin
                └── settings.gradle

因此文件夹 src/test/resources/simple 既可用于 JUnit 测试,也可用于使用复合构建方法从命令行运行 gradle 命令。

所以这应该有效

cd src/test/resources/simple
gradle build

这个单元测试也应该起作用:


    @Test
    public void testBuildSample() {
        final ClassLoader classLoader = ProjectSetupHelper.class.getClassLoader();
        final Path sampleSourceRootPath = Paths.get(classLoader.getResource("simple").toURI());

        final BuildResult result = GradleRunner.create()
                .withProjectDir(sampleSourceRootPath.toFile())
                .withArguments("build")
                .withPluginClasspath()
                .build();
    }

但是,在运行 JUnit 时需要注意,custom-plugin-sources 同时以两种不同的方式引用:

是否有更简单或更简洁的方法来实现上述目标:拥有一个具有复合构建的示例项目,可以从命令行使用它来验证插件的本地更改,并在插件的单元测试中使用该示例项目?

目前在单元测试中,我将示例文件夹复制到一个没有 settings.gradle 的临时文件夹以避免这种复杂性。

标签: testinggradlegradle-plugin

解决方案


派对有点晚了,但这就是我所做的。

我编写了一个自定义 gradle 插件,并能够使用 JUnit 成功测试它。

MyCustomPlugin.java

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.dsl.DependencyHandler;

public class MyCustomPlugin implements Plugin<Project>
{
    @Override
    public void apply(Project project)
    {
        DependencyHandler dependencyHandler = project.getDependencies();
        dependencyHandler.add(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, "org.apache.commons:commons-lang3:3.12.0");
    }
}

MyCustomPluginTest.java

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

import static org.gradle.internal.impldep.org.junit.Assert.assertTrue;

public class MyCustomPluginTest {
    @Test
    public void testCustomPlugin()
    {
        Project project = ProjectBuilder.builder().build();
        // Java plugin required for IMPLEMENTATION task in the custom plugin
        project.getPluginManager().apply("java");
        project.getPluginManager().apply("com.mycustomplugin");

        assertTrue(project.getPluginManager().hasPlugin("com.mycustomplugin"));
    }
}

资料来源:

  1. https://docs.gradle.org/current/userguide/custom_plugins.html#sec:writing_tests_for_your_plugin
  2. https://www.baeldung.com/gradle-create-plugin

推荐阅读