当项目包含多个 android 模块时未生成匕首测试组件
dagger test component not being generated when the project contains multiple android modules
Android Studio 3.4
kotlin 1.3.0
dagger 2.21
我有一个包含 presentation
和 data
模块的项目。我正在尝试在数据模块中创建测试组件。我可以为演示模块生成组件。我在 gradle 构建中使用 kotlin-kts。
对于演示模块,我有以下 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 不会生成测试组件 classes.
我在 java/test/package/di
目录中有以下测试组件
@Singleton
@Component(modules = [TestNetworkModule::class])
interface TestWestforceCeditUnionComponent {
fun inject(webServicesImpTest: WebServicesImpTest)
}
在我的测试中 class:
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
。
非常感谢您的任何建议
您忘记添加
kotlin("kapt")
到 :data
模块中的 plugins
部分 build.gradle.kts。
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
生成成功
Android Studio 3.4
kotlin 1.3.0
dagger 2.21
我有一个包含 presentation
和 data
模块的项目。我正在尝试在数据模块中创建测试组件。我可以为演示模块生成组件。我在 gradle 构建中使用 kotlin-kts。
对于演示模块,我有以下 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 不会生成测试组件 classes.
我在 java/test/package/di
目录中有以下测试组件
@Singleton
@Component(modules = [TestNetworkModule::class])
interface TestWestforceCeditUnionComponent {
fun inject(webServicesImpTest: WebServicesImpTest)
}
在我的测试中 class:
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
。
非常感谢您的任何建议
您忘记添加
kotlin("kapt")
到 :data
模块中的 plugins
部分 build.gradle.kts。
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
生成成功