BuildConfigField模拟在Kotlin中进行单元测试

时间:2018-09-05 08:55:32

标签: android unit-testing kotlin buildconfiguration

我正在尝试尽可能多地覆盖 Kotlin Android库,并且遇到有关自定义BuildConfig变量(通常称为buildConfigField)的问题。

我想模拟此变量以测试truefalse的值。

从Gradle文件中提取:

android {
    defaultConfig {
        buildConfigField "boolean", "ENABLE_LOG", "false"
    }
    flavorDimensions "log"
    productFlavors {
        loggable {
            buildConfigField "boolean", "ENABLE_LOG", "true"
            dimension "log"
        }
        notloggable {
            dimension "log"
        }
    }
}

要测试的Kotlin函数的提取:

fun buildClient(): MyClient {
    var myClientBuilder : MyClient.Builder = MyClient.Builder();

    if (BuildConfig.ENABLE_LOG) {
        val interceptor = LoggingInterceptor();
        interceptor.setLevel(LoggingInterceptor.Level.ALL);
        myClientBuilder.addInterceptor(interceptor);
    }

    return myClientBuilder.build()
}

单元测试:

@Test
fun buildClient_enableLog_oneInterceptor() {
    // GIVEN
    Mockito.mock(BuildConfig::class.java)
    Mockito.doReturn(true).`when`(BuildConfig.ENABLE_LOG)

    // WHEN
    val myClient = myService!!.buildClient()

    // THEN
    assertNotNull(myClient)
    assertNotNull(myClient.interceptors())
    assertEquals(1, myClient.interceptors().size)
}

我尝试了不同的方法,但从未成功。 如果有人已经完成了这项工作,它可以对我有很大帮助(我猜还有其他人)。

谢谢

2 个答案:

答案 0 :(得分:1)

ReflectionHelpers.setStaticField(BuildConfig::class.java, "ENABLE_LOG", true)

答案 1 :(得分:0)

默认情况下,所有测试都针对调试构建类型运行。您可以使用模块级 build.gradle 文件中的 testBuildType 属性将其更改为另一种构建类型。例如,如果您想针对您的“暂存”构建类型运行测试,请按以下代码段所示编辑文件。

安卓{ ... testBuildType“暂存” } 但这导致其他选项失败