can anyone help to solve this problem?
Previously, i try to create a instrumented test for my project. I create new module for unit test and an error occurred in the module when I created the class, then I generated class to create an instrumented test (stored in the package com.module.unit_test (androidTest)
) but why when I run ResourceComparer
class which is in the same package it gets error as in the title?
ResourceComparer.kt
:
package com.ichwan.unit_test
import android.content.Context
class ResourceComparer {
fun isEqual(context: Context, resId: Int, compare: String) : Boolean {
return context.getString(resId) == compare
}
}
ResourceComparerTest.kt
:
package com.ichwan.unit_test
import android.content.Context
import androidx.test.core.app.ApplicationProvider
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
import org.junit.Test
class ResourceComparerTest {
private lateinit var resourceComparer: ResourceComparer
@Before
fun setup() {
resourceComparer = ResourceComparer()
}
@After
fun tearDown(){
}
@Test
fun stringResourceSameAsGivenString_returnsTrue() {
val context = ApplicationProvider.getApplicationContext<Context>()
val result = resourceComparer.isEqual(context, androidx.compose.ui.R.string.selected, "selected")
assertThat(result).isTrue()
}
@Test
fun stringResourceSameAsGivenString_returnsFalse() {
val context = ApplicationProvider.getApplicationContext<Context>()
val result = resourceComparer.isEqual(context, androidx.compose.ui.R.string.selected, "selection")
assertThat(result).isFalse()
}
}
and this is result from logcat:
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/ichwan/unit_test/ResourceComparer;
at java.lang.Class.getDeclaredFields(Native Method)
at org.junit.runners.model.TestClass.getSortedDeclaredFields(TestClass.java:77)
at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:70)
at org.junit.runners.model.TestClass.<init>(TestClass.java:57)
at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:111)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:91)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:74)
at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:43)
at androidx.test.internal.runner.junit4.AndroidJUnit4Builder.runnerForClass(AndroidJUnit4Builder.java:51)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37)
at androidx.test.internal.runner.AndroidRunnerBuilder.runnerForClass(AndroidRunnerBuilder.java:149)
at androidx.test.internal.runner.ScanningTestLoader.doCreateRunner(ScanningTestLoader.java:50)
at androidx.test.internal.runner.TestLoader.getRunnersFor(TestLoader.java:64)
at androidx.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:835)
at androidx.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:650)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:418)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1932)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.ichwan.unit_test.ResourceComparer" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.ichwan.unit_test.test-2/base.apk", zip file "/data/app/com.ichwan.gigihmodule-2/base.apk", zip file "/data/app/com.ichwan.gigihmodule-2/split_config.en.apk", zip file "/data/app/com.ichwan.gigihmodule-2/split_config.xxhdpi.apk"],nativeLibraryDirectories=[/data/app/com.ichwan.unit_test.test-2/lib/x86, /data/app/com.ichwan.gigihmodule-2/lib/x86, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 18 more
Suppressed: java.io.IOException: No original dex files found for dex location /data/app/com.ichwan.gigihmodule-2/split_config.en.apk
at dalvik.system.DexFile.openDexFileNative(Native Method)
at dalvik.system.DexFile.openDexFile(DexFile.java:373)
at dalvik.system.DexFile.<init>(DexFile.java:113)
at dalvik.system.DexFile.<init>(DexFile.java:78)
at dalvik.system.DexPathList.loadDexFile(DexPathList.java:359)
at dalvik.system.DexPathList.makeElements(DexPathList.java:323)
at dalvik.system.DexPathList.makeDexElements(DexPathList.java:263)
at dalvik.system.DexPathList.<init>(DexPathList.java:126)
at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
at com.android.internal.os.PathClassLoaderFactory.createClassLoader(PathClassLoaderFactory.java:43)
at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:58)
at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:520)
at android.app.LoadedApk.getClassLoader(LoadedApk.java:553)
at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:1847)
at android.app.LoadedApk.getResources(LoadedApk.java:766)
at android.app.ContextImpl.<init>(ContextImpl.java:2066)
at android.app.ContextImpl.createAppContext(ContextImpl.java:2011)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5252)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Suppressed: java.io.IOException: No original dex files found for dex location /data/app/com.ichwan.gigihmodule-2/split_config.xxhdpi.apk
at dalvik.system.DexFile.openDexFileNative(Native Method)
at dalvik.system.DexFile.openDexFile(DexFile.java:373)
at dalvik.system.DexFile.<init>(DexFile.java:113)
at dalvik.system.DexFile.<init>(DexFile.java:78)
at dalvik.system.DexPathList.loadDexFile(DexPathList.java:359)
at dalvik.system.DexPathList.makeElements(DexPathList.java:323)
at dalvik.system.DexPathList.makeDexElements(DexPathList.java:263)
at dalvik.system.DexPathList.<init>(DexPathList.java:126)
at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
at com.android.internal.os.PathClassLoaderFactory.createClassLoader(PathClassLoaderFactory.java:43)
at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:58)
at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:520)
at android.app.LoadedApk.getClassLoader(LoadedApk.java:553)
at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:1847)
at android.app.LoadedApk.getResources(LoadedApk.java:766)
at android.app.ContextImpl.<init>(ContextImpl.java:2066)
at android.app.ContextImpl.createAppContext(ContextImpl.java:2011)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5252)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
I've read several sources here, but most of them have additional dependencies from Gradle. but I'm confused if the error is as stated in the logcat, are there additional libraries or missing gradle scripts?
this is my build.gradle (module)
scripts:
plugins {
id 'com.android.dynamic-feature'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'com.ichwan.unit_test'
compileSdk 34
defaultConfig {
applicationId "com.ichwan.unit_test"
minSdk 24
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
dataBinding true
}
}
dependencies {
implementation project(":app")
implementation 'androidx.core:core-ktx:1.10.1'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
testImplementation 'androidx.test:core:1.5.0'
testImplementation 'com.google.truth:truth:1.1.4'
androidTestImplementation 'com.google.truth:truth:1.1.4'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.annotation:annotation:1.6.0'
}