Java 在依赖于Android插件的自定义Gradle插件的单元测试中模拟应用程序变体

Java 在依赖于Android插件的自定义Gradle插件的单元测试中模拟应用程序变体,java,android,unit-testing,gradle,android-gradle-plugin,Java,Android,Unit Testing,Gradle,Android Gradle Plugin,我正在开发一个Gradle插件。我的插件依赖于Android Gradle插件。我的插件为每个Android应用程序变体添加了一个任务。每个任务名称都是根据变量名称生成的 public class MyPlugin implements Plugin<Project> { @Override void apply(Project project) { project.android.applicationVariants.all {

我正在开发一个Gradle插件。我的插件依赖于Android Gradle插件。我的插件为每个Android应用程序变体添加了一个任务。每个任务名称都是根据变量名称生成的

public class MyPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.android.applicationVariants.all {
            project.task(type: SendApkTask, dependsOn: it.assemble, "send${it.name.capitalize()}Apk")
        }
    }
}

我无法使这一主张通过。调试后,我发现
project.applicationVariants
为空。我添加任务的闭包从未运行过。如何让Android Gradle插件在我的测试中得到有效的模拟?我是否需要使用
ProjectBuilder
设置一个完整的模拟文件目录?

当使用
ProjectBuilder
对插件进行单元测试时,如果插件使用
Project.afterEvaluate()
,通常需要显式调用
Project.evaluate()
。在断言之前添加以下内容

project.evaluate()
Android Gradle插件还需要
project。要设置Android
,或者将抛出
NullPointerException

project.android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
}

在断言之前尝试调用
project.evaluate()
。android插件很可能正在
项目中进行配置。afterEvaluate{…}
块,这在执行配置时工作的插件中很常见,这取决于自定义项目扩展。谢谢!如果你发一个答案,我会接受它而不是我自己的。这无疑为我指明了正确的方向。
project.android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
}