【问题标题】:dagger test component not being generated when the project contains multiple android modules项目包含多个android模块时不生成匕首测试组件
【发布时间】:2019-03-30 18:25:18
【问题描述】:
Android Studio 3.4
kotlin 1.3.0
dagger 2.21

我有一个包含presentationdata 模块的项目。我正在尝试在数据模块中创建测试组件。我可以为演示模块生成组件。我正在使用 kotlin-kts 进行 gradle 构建。

对于演示文稿模块,我有以下build.gradle.kts

plugins {
    id("com.android.application")
    kotlin("android")
    kotlin("kapt")
}

android {
    compileSdkVersion(Versions.compileSdkVersion)

    defaultConfig {
        applicationId = "nz.org.westforce.mobileui"
        minSdkVersion(Versions.minSdkVersion)
        targetSdkVersion(Versions.targetSdkVersion)
        versionCode = Versions.versionCode
        versionName = Versions.versionName

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}

dependencies {
    implementation(Libraries.appCompat)
    implementation(Libraries.kotlinStdlib)
    implementation(Libraries.daggerAndroid)
    implementation(Libraries.daggerSupport)
    kapt(Libraries.daggerCompiler)
    kapt(Libraries.daggerProcessor)

    androidTestImplementation(TestLibraries.runner)
    androidTestImplementation(TestLibraries.espressoCore)

    testImplementation(TestLibraries.junit)
    testImplementation(Libraries.daggerAndroid)
    testImplementation(Libraries.daggerSupport)

    kaptTest(Libraries.daggerCompiler)
    kaptTest(Libraries.daggerProcessor)

    implementation(project(":data"))
}

对于演示模块,我有以下应用程序:

class WestforceCreditUnionMobileuiApplication
    : Application(), HasActivityInjector {

    @Inject
    lateinit var dispatchingAndroidActivityInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()

        DaggerWestforceCreditUnionMobileuiComponent.builder()
            .application(this)
            .build()
            .inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> =
        dispatchingAndroidActivityInjector
}

组件

@Singleton
@Component(modules = [AndroidSupportInjectionModule::class])
interface WestforceCreditUnionMobileuiComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: WestforceCreditUnionMobileuiApplication): Builder

        fun build(): WestforceCreditUnionMobileuiComponent
    }

    fun inject(application: WestforceCreditUnionMobileuiApplication)
}

以上工作正常,生成DaggerWestforceCreditUnionMobileuiComponent

现在在我的 data 模块中,我可以尝试创建一个测试组件,但 dagger 不会生成测试组件类。

我在java/test/package/di 目录中有以下测试组件

@Singleton
@Component(modules = [TestNetworkModule::class])
interface TestWestforceCeditUnionComponent {
    fun inject(webServicesImpTest: WebServicesImpTest)
}

在我的测试课中:

class WebServicesImpTest {

    @Inject
    private lateinit var webServicesImp: WebServicesImp

    @Test
    fun setUp() {
        /* the DaggerTestWestforceCreditUnionComponent is not generated */
    }
}

我没有在这里指定模块,因为它会使这里的代码膨胀太多。

对于我在数据模块中的 build.gradle.kts:

import org.gradle.kotlin.dsl.implementation

plugins {
    id("com.android.library")
    id("kotlin-android")
}

android {
    compileSdkVersion(Versions.compileSdkVersion)

    defaultConfig {
        minSdkVersion(Versions.minSdkVersion)
        targetSdkVersion(Versions.targetSdkVersion)
        versionCode = Versions.versionCode
        versionName = Versions.versionName

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}

dependencies {
    implementation(Libraries.kotlinStdlib)
    implementation(Libraries.appCompat)
    implementation(Libraries.daggerAndroid)
    implementation(Libraries.daggerSupport)
    kapt(Libraries.daggerCompiler)
    kapt(Libraries.daggerProcessor)

    testImplementation(TestLibraries.junit)
    testImplementation(TestLibraries.assertJ)
    testImplementation(TestLibraries.mockitoKotlin)

    testImplementation(Libraries.daggerAndroid)
    testImplementation(Libraries.daggerSupport)
    kaptTest(Libraries.daggerCompiler)
    kaptTest(Libraries.daggerProcessor)
}

我正在使用以下 dagger.android 依赖项:

  const val daggerAndroid = "com.google.dagger:dagger-android:${Versions.daggerAndroidVersion}"
  const val daggerCompiler = "com.google.dagger:dagger-compiler:${Versions.daggerAndroidVersion}"
  const val daggerProcessor = "com.google.dagger:dagger-android-processor:${Versions.daggerAndroidVersion}"
  const val daggerSupport = "com.google.dagger:dagger-android-support:${Versions.daggerAndroidVersion}"

我已经尝试重建项目并尝试运行以下任务compileDebugUnitTestSources

一切构建成功,

有人认为我正在考虑使用不同的 android 模块,也许数据模块在演示模块中看不到 WestforceCreditUnionMobileuiApplication

非常感谢您的任何建议

【问题讨论】:

  • 你可以尝试运行assembleAndroidTest
  • 我实际上已经尝试过了。我认为问题是因为我有 2 个 android 模块 presentationdata 应用程序在演示文稿中,也许 data 模块看不到。
  • 你把这个TestWestforceCeditUnionComponent放在哪里?
  • @ant2009,我已经下载了 Android Studio 3.4 RC2,但我无法导入项目(master 分支)。你能告诉我在你的设置中缺少什么吗?我的导入有什么问题?
  • @ant2009,很抱歉我帮不上忙。只要 Dmide 发布了答案,很明显他能够构建项目,因此问题出在我的设置中。希望 Dmide 的解决方案对您有用。

标签: android dagger-2 dagger


【解决方案1】:

你忘了添加

kotlin("kapt")

:data 模块 build.gradle.kts 中的 plugins 部分。

然后,Gradle 会出现有关您的 WebServicesImp 缺少 @Provides 的错误。您还应该修复缺少的Context 提供程序,在我的示例中,我刚刚删除了Context 使用。这应该添加到TestNetworkModule

@Singleton
@Provides
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
    return Retrofit.Builder()
        .baseUrl("http://www.holidaywebservice.com")
        .client(okHttpClient)
        .addConverterFactory(SimpleXmlConverterFactory.createNonStrict(Persister(AnnotationStrategy())))
        .build()
}
@Reusable
@Provides
fun provideWebServices(retrofit: Retrofit): WebServices {
    return retrofit.create(WebServices::class.java)
}

@Reusable
@Provides
fun provideWebServicesImp(webServices : WebServices): WebServicesImp {
    return WebServicesImp(webServices)
}

之后DaggerTestWestforceCeditUnionComponent就成功生成了。

【讨论】:

  • 谢谢,成功了,谢谢你的帮助。 plugins { id("com.android.library") id("kotlin-android") kotlin("android") kotlin("kapt") }我已经添加了上面的插件。我对这些有些困惑。你能解释一下吗?
  • kotlin("android") 在这个模块中启用 kotlin 支持(id("kotlin-android") 是相同但不同的方法), kotlin("kapt") 在这个模块中启用注释处理,这是匕首工作所必需的。
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 2018-01-17
  • 2021-01-19
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多