【问题标题】:Test Custom Gradle plugin after Evaluate评估后测试自定义 Gradle 插件
【发布时间】:2020-04-02 10:56:11
【问题描述】:

我正在开发一个 Gradle 自定义插件,但在如何测试它时遇到了问题。

插件创建一个扩展来接收配置,并在评估后 (project.afterEvaluate {) 使用接收到的配置创建一个任务,这些值是任务上的 @Input

按照文档https://docs.gradle.org/current/userguide/custom_plugins.html为插件创建测试,我使用以下内容创建项目并应用插件

@Before fun setup() {
  project = ProjectBuilder.builder().build()
  project.pluginManager.apply("my.plugin.name")

然后测试该扩展是否已创建:

assertTrue(project.extensions.findByName("name") is MyConfigType)

任务已创建:

assertTrue(project.tasks.findByName("mytask") is MyTaskType)

我遇到的问题是该任务仅创建afterEvaluate,因此此测试失败。据我了解,它必须是afterEvaluate 才能接收配置值。

所以我能看到我是否可以在测试中强制评估这个项目的唯一方法,但是如何?

是否有不同的方式来接收值?

【问题讨论】:

  • 我面临着完全相同的问题。你找到解决办法了吗?
  • 对不起@dpr 我什么也没得到。最后,我从 gradle 生命周期中提取了所有我可以使用的逻辑,以便我可以单独对其进行测试并手动测试该部分是否正常工作。

标签: gradle gradle-plugin


【解决方案1】:

我在 gradle 论坛上发布了我的类似问题,并且能够解决该问题: https://discuss.gradle.org/t/unit-test-plugins-afterevaulate/37437/3

显然afterEvaluate 不是执行任务创建的最佳/正确位置。如果你的扩展中有DomainObjectCollection,并且想要为集合中的每个元素创建一个任务,那么任务创建应该在集合的all-Callback 中完成:

final MyExtension extension = project.getExtensions().create("extension", MyExtension.class);
extension.configurations.all((c) -> {
  // register task here
});

如果你在扩展中有简单的属性作为输入提供给任务,你应该使用惰性配置:

public class MyExtension { 
  public final Property<String> property;
  public final NamedDomainObjectContainer<Configuration> configurations;

  @Inject
  public MyExtension(final ObjectFactory objectFactory) {
    property = objectFactory.property(String.class).convention("value");
    configurations = objectFactory.domainObjectContainer(Configuration.class);
  }
}

public abstract class MyTask extends DefaultTask {

  @Input
  private final Property<String> property = getProject().getObjects().property(String.class);

  public Property<String> getProperty() {
    return property;
  }
}

以及apply方法:

public class MyPlugin implements Plugin<Project> {

  @Override
  public void apply(final Project aProject) {
    final MyExtension extension = aProject.getExtensions().create("extension", MyExtension.class);
    aProject.getTasks().register("myTask", MyTask.class).configure((t) -> {
      t.getProperty().set(extension.property);
    });
  }
}

【讨论】:

    【解决方案2】:

    你应该打电话给project.evaluationDependsOn(":"):

    @Before fun setup() {
      project = ProjectBuilder.builder().build()
      project.pluginManager.apply("my.plugin.name")
      project.evaluationDependsOn(":") // <<--
      ...
    }
    

    它执行你的afterEvaluate 回调。

    【讨论】:

      猜你喜欢
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多