在Groovy单元测试中创建自定义Project类

问题描述

我在几个gradle插件中有一些共同的功能。其中一些是从公共父类扩展而来的,而有些则不是。我决定添加我的自定义DefaultProject类,在其中我可以方便地为那些不是从我的通用Plugin类扩展的插件的通用功能提供便利(基本上是不应由使用者直接使用而只能帮助配置其他插件插件类)。

我面临的问题是在单元测试中实例化此自定义 MyProject 类。 ProjectBuilder.builder().build()返回一个ProjectInternal,但我看不到一种返回其他子类的方法

@CompileStatic
class MyProject extends DefaultProject {

    MyProject(String name,ProjectInternal parent,File projectDir,File buildFile,ScriptSource buildScriptSource,GradleInternal gradle,ProjectState container,ServiceRegistryFactory serviceRegistryFactory,ClassLoaderScope selfClassLoaderScope,ClassLoaderScope baseClassLoaderScope) {
        super(name,parent,projectDir,buildFile,buildScriptSource,gradle,container,serviceRegistryFactory,selfClassLoaderScope,baseClassLoaderScope)
    }

    static MyProject from(org.gradle.api.internal.project.ProjectInternal project) {
        new Project(
            project.name,project.parent,project.projectDir,project.buildFile,project.buildScriptSource,project.gradle,project.state as ProjectState,project.serviceRegistryFactory,project.classLoaderScope,project.baseClassLoaderScope
        )
    }

    // ... helper functions shared with plugins
}

在上述单元测试中使用上述from(...)方法

MyProject project = MyProject.from(ProjectBuilder.builder().build() as ProjectInternal)

由于以下UnsupportedOperationException语句而导致if

// from org.gradle.internal.service.scopes.GradleGlobalServices
ServiceRegistryFactory createServiceRegistryFactory(final ServiceRegistry services) {
    final Factory<LoggingManagerInternal> loggingManagerInternalFactory = this.getFactory(LoggingManagerInternal.class);
    return new ServiceRegistryFactory() {
        public ServiceRegistry createFor(Object domainObject) {
            if (domainObject instanceof ProjectInternal) {
                ProjectScopeServices projectScopeServices = new ProjectScopeServices(services,(ProjectInternal)domainObject,loggingManagerInternalFactory);
                GradleScopeServices.this.registries.add(projectScopeServices);
                return projectScopeServices;
            } else {
                throw new UnsupportedOperationException();
            }
        }
    };
}

我认为我不应该从 org.gradle.api.internal.project.DefaultProject 的扩展名开始考虑其包名称中的 internal 字样。如果我错了,可以请您确认或纠正我吗?在插件之间共享项目功能而不用 static 方法依赖 util 类的惯用方式是什么?

请让我知道是否需要更多背景信息和感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)