Android Gradle插件3.6和4.0 R8不能用src / test代替src / main

问题描述 投票:0回答:1

我使用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,因此非常感谢您的帮助。

android android-gradle-plugin dagger
1个回答
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)
    }
}

我仍然不确定为什么它可行,或者甚至为什么现在需要它。只是一个幸运的猜测。任何进一步的见解将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.