我使用Espresso
运行MockRetrofit
测试以测试应用程序中的UI流程。 Espresso
测试依赖于交换位于Dagger
中的产品ApiModule
src/main/java/com/my/app/ApiModule
@Module(includes = [NetworkModule::class])
class ApiModule {
@Provides
@Singleton
fun restApi(
retrofit: Retrofit.Builder,
@DefaultClientBuilder clientBuilder: OkHttpClient.Builder
): RestApi {
val apiRetrofit = retrofit.client(clientBuilder.build()).build()
return apiRetrofit.create<RestApi>(RestApi::class.java)
}
}
[ApiModule
位于伪造的src/androidTest/java/com/my/app/ApiModule
中
@Module(includes = [NetworkModule::class])
class ApiModule {
@Provides
@Singleton
fun restApi(
retrofit: Retrofit.Builder,
@DefaultClientBuilder clientBuilder: OkHttpClient.Builder
): RestApi {
return MockApiModule.getApi(failureRate = FailureRate.NEVER, responseDelay = 500L)
}
}
我刚刚升级到AGP 3.6(然后又升级到4.0)。运行./gradlew connectedDebugAndroidTest
时测试仍通过。但是我还有一个名为debugMinified
buildTypes{
...
debugMinified {
minifyEnabled true
debuggable true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-testing.pro'
signingConfig signingConfigs.debug
}
...
}
我用模糊的apk来运行Espresso
测试以捕获与Pro-guard相关的运行时错误。
现在,当我运行./gradlew connectedDebugMinifiedAndroidTest
时,我的测试失败了,因为AGP在分析apk时没有交换androidTest
src集中的伪实现。它只是使用main
中的实际实现。但是同样,这仅在最小的版本中发生。
上面的类ApiModule
是我在运行UI测试时以此方式交换的5个类之一。其他4个与Dagger
无关,并且也不会被换出,因此我可以肯定,这不仅是Dagger
的问题。
当前阻止我升级到AGP 4.0,因此非常感谢您的帮助。
经过一番反复试验后,我只需将@Keep
添加到所有伪造的和真实的实现类签名中就可以解决此问题
@Keep
@Module(includes = [NetworkModule::class])
class ApiModule {
@Provides
@Singleton
fun restApi(
retrofit: Retrofit.Builder,
@DefaultClientBuilder clientBuilder: OkHttpClient.Builder
): RestApi {
val apiRetrofit = retrofit.client(clientBuilder.build()).build()
return apiRetrofit.create<RestApi>(RestApi::class.java)
}
}
@Keep
@Module(includes = [NetworkModule::class])
class ApiModule {
@Provides
@Singleton
fun restApi(
retrofit: Retrofit.Builder,
@DefaultClientBuilder clientBuilder: OkHttpClient.Builder
): RestApi {
return MockApiModule.getApi(failureRate = FailureRate.NEVER, responseDelay = 500L)
}
}
我仍然不确定为什么它可行,或者甚至为什么现在需要它。只是一个幸运的猜测。任何进一步的见解将不胜感激。