Azure运行Android测试遇类型不匹配错误,指向HttpLoggingInterceptor
Azure流水线Android测试编译失败排查与解决
问题现象
在Azure流水线执行Android项目test步骤时,compileDebugKotlin和compileReleaseKotlin两个Gradle任务失败,错误信息:
Type mismatch: inferred type is () -> String? but String? was expected
问题指向HttpLoggingInterceptor相关代码,但本地执行相同Gradle任务无异常。已更新Interceptor依赖,本地与Azure均使用Gradle Wrapper 8.0。
相关代码
OkHttpClient构建代码
private fun getHttpClient( ): OkHttpClient { val logger = HttpLoggingInterceptor() logger.level = HttpLoggingInterceptor.Level.BODY val customLoggingInterceptor = CustomLoggingInterceptor(logger) return OkHttpClient.Builder() .addInterceptor( BearerInterceptor { token } ) .addInterceptor( customLoggingInterceptor ) .addInterceptor( logger ) .connectTimeout( CONNECTION_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS ) .readTimeout( CONNECTION_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS ) .build() }
Azure流水线YAML配置
# Android # Build your Android project with Gradle. # Add steps that test, sign, and distribute the APK, save build artifacts, and more: # https://docs.microsoft.com/azure/devops/pipelines/languages/android # Pipeline to run the tests as a precondition to every direct commit / Pull Request to develop/main branches trigger: branches: include: - develop - main pr: branches: include: - develop - main pool: vmImage: 'ubuntu-latest' resources: repositories: - repository: my_subrepository type: git name: TheAzureProject/TheMainRepository steps: - checkout: self - checkout: my_subrepository path: s/TheMainRepository/my_subrepository - task: JavaToolInstaller@0 displayName: Setup Java 17 inputs: versionSpec: '17' jdkArchitectureOption: 'x64' jdkSourceOption: 'PreInstalled' - task: Gradle@3 displayName: Run Tests inputs: workingDirectory: 'TheMainRepository' gradleWrapperFile: 'TheMainRepository/gradlew' gradleOptions: '-Xmx3072m' javaHomeOption: 'JDKVersion' publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' tasks: 'test'
解决方案
核心代码修正
错误的直接原因是BearerInterceptor的参数传递错误:当前代码BearerInterceptor { token }传递的是一个lambda表达式(类型为() -> String?),但BearerInterceptor的构造函数期望接收String?类型的参数。只需去掉lambda的大括号,直接传入token变量即可:
.addInterceptor( BearerInterceptor(token) )
额外排查方向(若上述修正无效)
如果BearerInterceptor设计上确实需要接收一个提供token的函数(参数类型为() -> String?),需检查:
- 流水线中拉取的子仓库
my_subrepository里,BearerInterceptor的实现是否与本地一致,避免因代码同步不及时导致的定义差异。 - 确认依赖更新是否在流水线中生效,可在流水线中添加
./gradlew dependencies任务查看依赖版本。
内容的提问来源于stack exchange,提问作者Pedro Gonzalez
相关产品推荐
相关产品推荐

