Android Плагин Gradle 3.6 и 4.0 R8 не заменяет sr c / main на sr c / test - PullRequest
0 голосов
/ 29 мая 2020

Я запускаю Espresso тесты, используя MockRetrofit для тестирования потоков пользовательского интерфейса в приложении. Тесты 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
        }
    ...
}

, которую я использую для запуска тестов Espresso с обфусцированным apk для обнаружения ошибок времени выполнения, связанных с Pro-guard.

Теперь, когда Я запускаю ./gradlew connectedDebugMinifiedAndroidTest, мои тесты терпят неудачу, потому что AGP не меняет местами поддельную реализацию в наборе androidTest sr c при анализе apk. Он просто использует реальную реализацию в main. Но опять же, это происходит только для минифицированных сборок.

Вышеупомянутый класс ApiModule - один из 5 классов, которые я заменяю таким образом при запуске тестов пользовательского интерфейса. Остальные 4 не имеют ничего общего с Dagger и также не заменяются, поэтому я относительно уверен, что это не просто проблема Dagger.

Это в настоящее время не позволяет мне перейти на AGP 4.0, поэтому любая помощь приветствуется.

1 Ответ

0 голосов
/ 29 мая 2020

После некоторых проб и ошибок я смог решить эту проблему, просто добавив @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)
    }
}

Я все еще не уверен, почему это работает , или даже зачем это нужно сейчас. Просто удачная догадка. Будем признательны за любую дополнительную информацию.

...