如何防止特定风格的单元测试被编译成另一种风格?

How do I prevent a flavor specific unit test from being compiled in another flavor?

我正在尝试这样做,但是只有一个维度,所以更简单:

app 模块 build.gradle 指定 2 种口味,免费和收费:

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

    android {
        compileSdkVersion 28
        defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner 
    "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android- 
     optimize.txt'), 'proguard-rules.pro'
        }
    }
    flavorDimensions 'someFlavor'
    productFlavors {
        premium {
            applicationIdSuffix '.premium'
        }

        free
    }
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
        debug.java.srcDirs += 'src/debug/kotlin'
        release.java.srcDirs += 'src/release/kotlin'

        free {
            java.srcDirs += 'src/free/kotlin'
            test.java.srcDirs += 'src/test/kotlin'
        }

        premium {
            java.srcDirs += 'src/premium/kotlin'
            test.java.srcDirs += ['src/test/kotlin', 
        'src/testPremium/kotlin']
        }
    }
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:design:28.0.0'
}

Android Studio 的项目视图显示:

app
  src
    free
      kotlin (empty folder for now)
    main
      java
        com.example.myapplication
          MainActivity.java
    premium
      kotlin
        com.example.myapplication
          PremiumFile.kt
    test
      kotlin
        com.example.myapplication
          MainTest.kt
    testPremium
      kotlin
        com.example.myapplication
          PremiumTest.kt

PremiumFile.kt

class PremiumFile {
  companion obnject {
    const val PREMIUM_NUM = 10
  }
}

MainTest.kt

class MainTest {
    @Test
    fun basicMainTest() {
      assertEquals(1, 1)
    }
}

PremiumTest.kt

class PremiumTest {
    @Test
    fun premiumTest() {
        assertEquals(PremiumFile.Premium_NUM, 1)
    }
}

如您所见,我缺少任何针对免费版本的单元测试。我预计 运行 ./gradlew compileFreeReleaseUnitTestKotlin 会编译 src/test 内的共享单元测试,但它也会编译 src/testPremium 内的高级单元测试。如何确保 PremiumTest.kt 仅针对高级任务​​编译,例如 ./gradlew compilePremiumReleaseUnitTestKotlin?

如果您 运行 gradlew sourceSets 在您的项目中,您将获得以下部分:

test
----
Compile configuration: testCompile
build.gradle name: android.sourceSets.test
Java sources: [app\src\test\java, app\src\test\kotlin, app\src\testPremium\kotlin]
Java-style resources: [app\src\test\resources]

testPremium
-----------
Compile configuration: testPremiumCompile
build.gradle name: android.sourceSets.testPremium
Java sources: [app\src\testPremium\java]
Java-style resources: [app\src\testPremium\resources]

如您所见,app\src\testPremium\kotlin 在主要 test 配置中,而不是在 testPremium 中。并且因为 test 在所有风格中共享,它的来源包含在所有风格中(例如 testFree 配置将包括在 testtestFree 配置中指定的来源)。 =31=]

它还建议您如何解决问题 - 在配置块中使用 testPremium。所以而不是

premium {
    java.srcDirs += 'src/premium/kotlin' 
    test.java.srcDirs += ['src/test/kotlin', 'src/testPremium/kotlin']
}

premium {
    java.srcDirs += 'src/premium/kotlin'
}
test{
    java.srcDirs += 'src/test/kotlin'
}
testPremium {
    java.srcDirs += 'src/testPremium/kotlin'
}

所以gradlew sourseSets会给你:

test
----
Compile configuration: testCompile
build.gradle name: android.sourceSets.test
Java sources: [app\src\test\java, app\src\test\kotlin]
Java-style resources: [app\src\test\resources]

testPremium
-----------
Compile configuration: testPremiumCompile
build.gradle name: android.sourceSets.testPremium
Java sources: [app\src\testPremium\java, app\src\testPremium\kotlin]
Java-style resources: [app\src\testPremium\resources]

因为 test 不存在于 AndroidSourceSet 中,所以它不是 'type' 来源,如 'java'、'resources' 等。相反,testAndroidSourceSet 的另一个实例。因此,当您编写 test.java.srcDirs 时,您实际上是在配置这个顶级 test 源集,而不是 premium.

中的测试