testing - 如何在同一个示例项目中使用 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"));
}
}
资料来源:
推荐阅读
- excel - 使用数组而不是常规循环
- c# - C# 在单声道中使用 MKL 库
- java - ReflectionRepositoryInvoker.invokeFindById 想要调用 findOne,我不允许在我的存储库上声明它
- c# - 查找笔记包含附件的 Outlook 联系人
- oracle - ORA-00907 在 SELECT 中缺少右括号
- excel - 尝试使用 application.GetOpenFilename 打开 .zip 中的 excel 文件
- android - Gradle 如何包含 build.gradle 中未包含的依赖项
- elasticsearch - ES 6.x,join类型,当父子文档有相同字段时。将其存储为一个或两个字段?
- javascript - 替换孩子而不是将其附加到表中
- google-api - 创建始终与用户共享的文件和文件夹