Reputation: 21
I've just started off compiling classes and modules for UI testing of android project. The one is using di and there is a necessity of injecting some dependencies in my tests. Right away I've faced some troubles resolving my test component. Trying to simplify the issue, I created an empty test and empty test component. Despite this the component stays unresolved while the same construct was successfully resolved inside the other android project.
In my opinion using such empty component allows to cut off the majority of places where the mistake can be hided except for gradle files (anyway it can be wrong).
Here are component and test class:
class LoginTest {
init {
try {
UiThreadStatement.runOnUiThread {
val testTest: TestComponent = DaggerTestComponent
.builder()
.build()
}
} catch (throwable: Throwable) {
throwable.printStackTrace()
}
}
@Test
fun test() {
}
}
---------------------
@Component
interface TestComponent {
}
And here is an app gradle:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.google.gms.google-services'
repositories {
maven { url 'https://maven.fabric.io/public' }
}
android {
compileSdkVersion configuration.compileSdkVersion
buildToolsVersion configuration.buildToolsVersion
defaultConfig {
applicationId configuration.package
minSdkVersion configuration.minSdkVersion
targetSdkVersion configuration.targetSdkVersion
versionCode configuration.versionCode
versionName "${configuration.versionMajor}" +
".${configuration.versionMinor}" +
".${configuration.versionPatch}"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
signingConfigs {
debug {
storeFile file("debug.keystore")
}
release {
storePassword KEYSTORE_PASSWORD
keyAlias KEY_ALIAS
keyPassword KEY_PASSWORD
}
}
buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "default"
productFlavors {
mock {
dimension "default"
minSdkVersion configuration.minSdkVersion
ext.enableCrashlytics = false
}
dev {
versionNameSuffix "-dev"
applicationIdSuffix '.dev'
minSdkVersion configuration.minSdkVersion
ext.enableCrashlytics = false
}
prod {
dimension "default"
minSdkVersion configuration.minSdkVersion
}
}
kapt {
generateStubs = true
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
prod.java.srcDirs += 'src/prod/kotlin'
dev.java.srcDirs += 'src/dev/kotlin'
debug.java.srcDirs += 'src/debug/kotlin'
test.java.srcDirs += 'src/test/kotlin'
mock.java.srcDirs += 'src/mock/kotlin'
androidTest.java.srcDirs += 'src/androidTest/kotlin'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$libraries.kotlin_version"
// Support
implementation "com.android.support:appcompat-v7:$libraries.supportVersion"
implementation "com.android.support:design:$libraries.supportVersion"
implementation "com.android.support:recyclerview-v7:$libraries.supportVersion"
// Rx
implementation "io.reactivex.rxjava2:rxjava:$libraries.rxjava"
implementation "io.reactivex.rxjava2:rxandroid:$libraries.rxandroid"
implementation "com.jakewharton.rxbinding2:rxbinding-kotlin:$libraries.rxbinding"
implementation "com.jakewharton.rxbinding2:rxbinding-design-kotlin:$libraries.rxbinding"
implementation "com.jakewharton.rxbinding2:rxbinding-recyclerview-v7-kotlin:$libraries.rxbinding"
// OkHttpVersion
implementation "com.squareup.okhttp3:okhttp:$libraries.okhttpVersion"
implementation "com.squareup.okhttp3:logging-interceptor:$libraries.okhttpVersion"
// Retrofit
implementation "com.squareup.retrofit2:converter-gson:$libraries.retrofit"
implementation "com.squareup.retrofit2:retrofit:$libraries.retrofit"
implementation "com.squareup.retrofit2:adapter-rxjava2:$libraries.retrofit"
// Dagger
implementation "com.google.dagger:dagger:$libraries.dagger"
implementation "com.google.dagger:dagger-android-support:$libraries.dagger"
kapt "com.google.dagger:dagger-android-processor:$libraries.dagger"
kapt "com.google.dagger:dagger-compiler:$libraries.dagger_compiler"
// Junit
testImplementation "junit:junit:$libraries.junitVersion"
// Runner
androidTestImplementation "com.android.support.test:runner:$libraries.testRunner"
// Espresso
androidTestImplementation "com.android.support.test.espresso:espresso-core:$libraries.espressoCore"
// Spoon
androidTestImplementation 'com.squareup.spoon:spoon-client:1.7.1'
}
UPD: The error is extremely uninformative and looks like:
e: ...\LoginTest.kt: (11, 37): Unresolved reference: DaggerTestComponent
:app:compileMockDebugAndroidTestKotlin FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:compileMockDebugAndroidTestKotlin'.
> Compilation error. See log for more details
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Upvotes: 1
Views: 212
Reputation: 21
My apologize to who posted the right answer a few times ago.
The key strings to be added to gradle:
kaptAndroidTest "com.google.dagger:dagger-compiler:$libraries.dagger"
kaptAndroidTest "com.google.dagger:dagger-android-processor:$libraries.dagger"
Upvotes: 1