如何解决如何在同一个示例项目中使用 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 同时以两种不同的方式被引用:
-
GradleRunner.create().withProjectDir(testProjectPath.toFile()).withPluginClasspath()
表示将项目自定义插件文件添加到类路径中,以便在单元测试期间运行构建 - 在
src/test/resources/simple/settings.gradle
中,includeBuild ...
命令也指自定义插件。
是否有更简单或更简洁的方法来实现上述目标:拥有一个带有复合构建的示例项目,可以从命令行使用它来验证对插件的本地更改,并在插件的单元测试中使用该示例项目?
目前在单元测试中,我将示例文件夹复制到一个没有 settings.gradle 的临时文件夹,以避免出现这种复杂情况。
解决方法
聚会有点晚了,但这是我所做的。
我编写了一个自定义 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"));
}
}
来源:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。