评估后测试自定义Gradle插件

评估后测试自定义Gradle插件,gradle,gradle-plugin,Gradle,Gradle Plugin,我正在开发一个Gradle自定义插件,我在如何测试它上遇到了问题 插件创建一个扩展以接收配置,并在评估(project.afterEvaluate{)后使用接收的配置创建一个任务,这些值是任务上的@Input 根据为插件创建测试的文档,我使用以下内容创建项目并应用插件 @Before fun setup() { project = ProjectBuilder.builder().build() project.pluginManager.apply("my.plugin.na

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

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

根据为插件创建测试的文档,我使用以下内容创建项目并应用插件

@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)
并且创建了任务:

assertTrue(project.extensions.findByName("name") is MyConfigType)
assertTrue(project.tasks.findByName("mytask") is MyTaskType)
我遇到的问题是,任务仅在评估后创建,因此此测试失败。据我所知,它必须是评估后创建的,以便它可以接收配置值

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


是否有不同的方式来接受价值观?

我在gradle论坛上发布了类似的问题,并且能够解决这个问题:

显然,
afterEvaluate
不是执行任务创建的最佳/正确位置。如果您的扩展中有一个
DomainObjectCollection
,并且希望为集合中的每个元素创建一个任务,则任务创建应在集合的以下位置完成:

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;
  }
}
公共类MyExtension{
公共最终财产;
公共最终名称DomainObjectContainer配置;
@注入
公共MyExtension(最终ObjectFactory ObjectFactory){
property=objectFactory.property(String.class).convention(“值”);
configurations=objectFactory.domainObjectContainer(Configuration.class);
}
}
公共抽象类MyTask扩展了DefaultTask{
@输入
私有最终属性Property=getProject().getObjects().Property(String.class);
公共属性getProperty(){
归还财产;
}
}
以及应用方法:

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);
    });
  }
}
公共类MyPlugin实现插件{
@凌驾
公共无效申请(最终项目或项目){
final MyExtension extension=aProject.getExtensions().create(“extension”,MyExtension.class);
aProject.getTasks().register(“myTask”,myTask.class)。configure((t)->{
t、 getProperty().set(扩展名.property);
});
}
}

我面临着完全相同的问题。你能找到解决方案吗?抱歉@dpr我什么都没有。最后我从gradle生命周期中提取了我能提取的所有逻辑,以便我可以单独测试,并手动测试该部件是否正常工作。