在自定义Gradle插件的单元测试中模拟应用程序变量,这取决于Android插件

时间:2014-12-31 02:14:27

标签: java android unit-testing gradle android-gradle

我正在开发Gradle插件。我的插件取决于Android Gradle插件。我的插件为每个Android Application Variant添加了一个任务。每个任务名称都是根据变体名称构建的。

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")
        }
    }
}

我想为MyPlugin #application(Project)创建一个单元测试。测试应验证是否已添加任务。默认情况下,应该只有发布和调试版本。

public class MyPluginTest {

    Project project

    @Before
    public void setup() {
        project = ProjectBuilder.builder().build()
    }

    @Test
    public void testMyPluginAddsTasks() {
        project.apply plugin: 'com.android.application'
        project.apply plugin: MyPlugin

        assertNotNull(project.tasks['sendReleaseApk'])
    }
}

我无法通过这个断言。调试后,我发现project.applicationVariants为空。我的关闭添加任务永远不会运行。如何有效地为我的测试嘲笑Android Gradle插件?我是否需要使用ProjectBuilder设置整个模拟文件目录?

1 个答案:

答案 0 :(得分:2)

使用ProjectBuilder进行单元测试插件时,在插件使用Project.evaluate()的情况下,通常需要明确调用Project.afterEvaluate()。在断言之前添加以下内容。

project.evaluate()

Android Gradle插件还需要设置project.android,否则会引发NullPointerException

project.android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
}