android - 在 Kotlin 中进行单元测试的 BuildConfigField 模拟
问题描述
我正在尝试尽可能多地涵盖Kotlin Android 库,但遇到了一个关于自定义 BuildConfig 变量的问题,通常称为buildConfigField
.
我想模拟这个变量来测试true
和false
值。
从 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)
}
我尝试了不同的东西,但它从来没有奏效。如果有人已经完成了这项工作,它可以帮助我很多(我猜还有其他人)。
谢谢
解决方案
ReflectionHelpers.setStaticField(BuildConfig::class.java, "ENABLE_LOG", true)
推荐阅读
- reactjs - React Native - 我似乎无法让 Axios 和 AsyncStorage 在 Android 中一起工作,但代码在 iOS 上工作?
- c# - 实现接口的实体的通用配置
- mysql - mysql数据过滤
- python - glob 与 if 语句来选择哪些文件存储到一个变量?
- sql-server - SQL Server:安全地将数据移动到(维护不善的)历史表
- https - 我想把 kibana 带到 https 上。有什么方法可以做到
- python - 在 PyQt4 中动态创建/填充 QTableWidgets
- angular - 使用 null 过滤
- git - 使用 S3 Maven 存储库构建代码
- microsoft-translator - 无法将文件上传到 Microsoft 自定义翻译器