无法获得财产' kotlinOutputDir'在null对象上 - Kotlin和Spock

时间:2017-10-13 14:12:00

标签: android groovy kotlin spock

我正在尝试使用Kotlin测试Spock Framework个班级。 当我的项目中只有Java类时,一切正常。但是在将1.1.51版本中的kotlin添加到我的项目之后,测试停止了工作,现在我收到了这样的错误:

Error:Execution failed for task ':app:compileDebugUnitTestGroovyWithGroovyc'.
> Cannot get property 'kotlinOutputDir' on null object

我正在使用Android Studio 3.0 Beta 7

这是我的项目和模块build.gradle文件:

项目build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.1.51'

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-beta7'
        classpath 'org.codehaus.groovy:groovy-android-gradle-plugin:1.2.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.google.gms:google-services:3.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

模块build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'groovyx.android'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "com.redione.debtscalc"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.google.firebase:firebase-auth:11.4.2'
    implementation 'com.google.firebase:firebase-database:11.4.2'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"

    testImplementation 'org.mockito:mockito-core:2.10.0'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    testImplementation 'org.codehaus.groovy:groovy:2.4.11:grooid'
    testImplementation('org.spockframework:spock-core:1.1-groovy-2.4') {
        exclude group: 'org.codehaus.groovy'
        exclude group: 'junit'
    }    
}


apply plugin: 'com.google.gms.google-services'
repositories {
    mavenCentral()
}

1 个答案:

答案 0 :(得分:2)

更新

Groovy Android Gradle插件发布了v2.0.0,与Android Gradle Plugin 3.0.0兼容。编辑根build.gradle

classpath 'org.codehaus.groovy:groovy-android-gradle-plugin:2.0.0'

原始答案(不应该使用!),我出于历史目的。

原始答案

简短的回答是,应该尽快修复Groovy Android Gradle Plugin v2.0.0,目前正在进行中。

答案较长(即时支付),您可以按如下方式解决此问题。有关Github上的问题,请参阅my comment

以下内容应添加到app/build.gradle

// Ugly workaround for incompatibility between Groovy Android Gradle Plugin 1.2.0 and Android Gradle Plugin 3.0.0
// Should be fixed with Groovy Android Gradle Plugin 1.3.0. https://github.com/groovy/groovy-android-gradle-plugin/pull/155
task copyFlavorDebugUnitTestKotlinClasses(type: CopyKotlinClasses)
class CopyKotlinClasses extends DefaultTask {

    def kotlinOutputDir = ["$project.rootDir/app/build/tmp/kotlin-classes/flavorDebugUnitTest"]

    @TaskAction
    def doNothing() {
    }
}

请注意,您必须更换" flavor"根据您的项目的实际风味,或者如果您不使用产品风味,请删除它。