android-junit5 icon indicating copy to clipboard operation
android-junit5 copied to clipboard

connectedDebugAndroidTest problem with mockk and 1.5.0-SNAPSHOT

Open compscidr opened this issue 1 year ago • 0 comments

Tests are all passing, however, it shows that there have been failures. Looks like its having trouble loading the mockk classes somehow. If I switch back to 1.4.0, everything works. Also, if I remove mockk-android or mockk from the android-test bundle, it also works (if I don't intend to actually use mockk in the tests). Was actually trying to use the fix from: https://github.com/mannodermaus/android-junit5/issues/298

Not sure, if this is the right place to file the bug, or if I should dig deeper on the mockk side of things.

image

Getting this in the logs:

org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to discover tests
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:160)
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverSafely(EngineDiscoveryOrchestrator.java:132)
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:107)
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:78)
at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:99)
at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:77)
at org.junit.platform.launcher.core.DelegatingLauncher.discover(DelegatingLauncher.java:42)
at org.junit.platform.launcher.core.SessionPerRequestLauncher.discover(SessionPerRequestLauncher.java:56)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5.generateTestTree(AndroidJUnit5.kt:50)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5.access$generateTestTree(AndroidJUnit5.kt:21)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5$testTree$2.invoke(AndroidJUnit5.kt:29)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5$testTree$2.invoke(AndroidJUnit5.kt:29)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5.getTestTree(AndroidJUnit5.kt:29)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5.getDescription(AndroidJUnit5.kt:32)
at de.mannodermaus.junit5.internal.runners.JUnit5RunnerFactoryKt.hasExecutableTests(JUnit5RunnerFactory.kt:32)
at de.mannodermaus.junit5.internal.runners.JUnit5RunnerFactoryKt.tryCreateJUnit5Runner(JUnit5RunnerFactory.kt:28)
at de.mannodermaus.junit5.AndroidJUnit5Builder.runnerForClass(AndroidJUnit5Builder.kt:77)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
at androidx.test.internal.runner.AndroidRunnerBuilder.runnerForClass(AndroidRunnerBuilder.java:143)
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:2361)
Caused by: org.junit.platform.commons.JUnitException: ClassSelector [className = 'io.mockk.proxy.jvm.JvmMockKAgentFactory', classLoader = dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/system/framework/android.test.base.jar", zip file "/data/app/~~TV23CVIoXHtVAuhqSh-j7A==/com.example.myapplication.test-MfJoN4xO8B8S430w0qrblQ==/base.apk", zip file "/data/app/~~t7S-BGWQS5UC5E7g08zeLQ==/com.example.myapplication-07g85h48nZYF_ztkTTgh3Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~TV23CVIoXHtVAuhqSh-j7A==/com.example.myapplication.test-MfJoN4xO8B8S430w0qrblQ==/lib/arm64, /data/app/~~t7S-BGWQS5UC5E7g08zeLQ==/com.example.myapplication-07g85h48nZYF_ztkTTgh3Q==/lib/arm64, /system/lib64, /system_ext/lib64]]]] resolution failed
at org.junit.platform.launcher.listeners.discovery.AbortOnFailureLauncherDiscoveryListener.selectorProcessed(AbortOnFailureLauncherDiscoveryListener.java:39)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:103)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.run(EngineDiscoveryRequestResolution.java:83)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.resolve(EngineDiscoveryRequestResolver.java:113)
at org.junit.jupiter.engine.discovery.DiscoverySelectorResolver.resolveSelectors(DiscoverySelectorResolver.java:46)
at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:69)
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:152)
... 25 more
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/instrument/Instrumentation;
at java.lang.reflect.Executable.getMethodReturnTypeInternal(Native Method)
at java.lang.reflect.Method.getReturnType(Method.java:148)
at java.lang.Class.getDeclaredMethods(Class.java:2728)
at org.junit.platform.commons.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:1568)
at org.junit.platform.commons.util.ReflectionUtils.findMethod(ReflectionUtils.java:1408)
at org.junit.platform.commons.util.ReflectionUtils.isMethodPresent(ReflectionUtils.java:1306)
at org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests.hasTestOrTestFactoryOrTestTemplateMethods(IsTestClassWithTests.java:50)
at org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests.test(IsTestClassWithTests.java:46)
at org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolve(ClassSelectorResolver.java:67)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolve$2$org-junit-platform-engine-support-discovery-EngineDiscoveryRequestResolution(EngineDiscoveryRequestResolution.java:135)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution$$ExternalSyntheticLambda2.apply(D8$$SyntheticClass:0)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:205)
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1619)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:134)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:531)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:517)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:503)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:236)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:484)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:189)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:126)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:92)
... 30 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.instrument.Instrumentation" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/system/framework/android.test.base.jar", zip file "/data/app/~~TV23CVIoXHtVAuhqSh-j7A==/com.example.myapplication.test-MfJoN4xO8B8S430w0qrblQ==/base.apk", zip file "/data/app/~~t7S-BGWQS5UC5E7g08zeLQ==/com.example.myapplication-07g85h48nZYF_ztkTTgh3Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~TV23CVIoXHtVAuhqSh-j7A==/com.example.myapplication.test-MfJoN4xO8B8S430w0qrblQ==/lib/arm64, /data/app/~~t7S-BGWQS5UC5E7g08zeLQ==/com.example.myapplication-07g85h48nZYF_ztkTTgh3Q==/lib/arm64, /system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 53 more

Here's my build.gradle.kts:

plugins {
    id("jacoco")
    alias(libs.plugins.android.application)
    alias(libs.plugins.de.mannodermaus.android.junit5)
    alias(libs.plugins.dokka)
    alias(libs.plugins.hilt)
    alias(libs.plugins.jetbrains.kotlin.android)
    alias(libs.plugins.kotlin.ksp)
    alias(libs.plugins.kotlinter)
}

android {
    namespace = "com.example.myapplication"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.example.myapplication"
        minSdk = 23
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"
        multiDexEnabled = true

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        testInstrumentationRunnerArguments["runnerBuilder"] = "de.mannodermaus.junit5.AndroidJUnit5Builder"
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }

    buildTypes {
        release {
            isShrinkResources = true
            isMinifyEnabled = true
        }
        debug {
            isShrinkResources = false
            isMinifyEnabled = false
            enableAndroidTestCoverage = true
            enableUnitTestCoverage = true
        }
    }

    tasks.withType<Test>().configureEach {
        useJUnitPlatform()
        configure<JacocoTaskExtension> {
            isIncludeNoLocationClasses = true
            excludes = listOf("jdk.internal.*")
        }
        finalizedBy("jacocoTestReport")
    }
}

dependencies {
    implementation(libs.androidx.multidex)
    implementation(libs.androidx.appcompat)
    implementation(libs.core.ktx)
    implementation(libs.androidx.constraintlayout)
    implementation(libs.hilt.android)
    ksp(libs.hilt.compiler)

    testImplementation(libs.bundles.test)
    testRuntimeOnly(libs.junit.jupiter.engine)

    androidTestImplementation(libs.bundles.android.test)
    androidTestRuntimeOnly(libs.de.manodermaus.android.junit5.runner)

    api(libs.slf4j.api)
    implementation(libs.logback.android)
    implementation(libs.logback.papertrail) {
        exclude(group = "ch.qos.logback")
    }
}

jacoco {
    toolVersion = libs.versions.jacoco.get()
}

And here's my libs.versions.toml:

[versions]
agp = "8.4.1"
androidx_test_runner = "1.5.2"
androidx_test_monitor = "1.6.1"
androidx_test_ui_automator = "2.3.0"
appversioning = "1.3.2"
appcompat = "1.7.0"
constraintlayout = "2.1.4"
coreKtxVersion = "1.13.1"
dokka = "1.9.20"
dotenv = "4.0.0"
jacoco = "0.8.12"
jupiter = "5.10.2"
hilt = "2.51.1"
ksp = "2.0.0-1.0.21"
kotlin = "2.0.0"
kotlinter = "4.3.0"
logback-android = "3.0.0"
logback-classic = "1.5.6"
logback-papertail = "1.0.0"
mannodermaus_junit5_plugin = "1.10.0.0"
mannodermaus_junit5 = "1.5.0-SNAPSHOT"
mockk = "1.13.11"
multidex = "2.0.1"
slf4j = "2.0.13"     # this should depend on what is supported by: https://github.com/tony19/logback-android

[libraries]
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" }
androidx-multidex = { module = "androidx.multidex:multidex", version.ref = "multidex" }
androidx_test_runner = { module = "androidx.test:runner", version.ref = "androidx_test_runner" }
androidx_test_monitor = { module = "androidx.test:monitor", version.ref = "androidx_test_monitor" }
androidx_test_uiautomator = { module = "androidx.test.uiautomator:uiautomator", version.ref = "androidx_test_ui_automator" }
core-ktx = { module = "androidx.core:core-ktx", version.ref = "coreKtxVersion" }
hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }
hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" }
junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "jupiter" }
junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "jupiter" }
logback-android = { module = "com.github.tony19:logback-android", version.ref = "logback-android" }
logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback-classic" }
logback-papertrail = { module = "com.papertrailapp:logback-syslog4j", version.ref = "logback-papertail" }
de-manodermaus-android-junit5 = { module = "de.mannodermaus.junit5:android-test-core", version.ref = "mannodermaus_junit5" }
de-manodermaus-android-junit5-runner = { module = "de.mannodermaus.junit5:android-test-runner", version.ref = "mannodermaus_junit5" }
mockk = { module = "io.mockk:mockk", version.ref = "mockk" }
mockk-android = { module = "io.mockk:mockk-android", version.ref = "mockk" }
slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" }

[bundles]
android-test = ["junit-jupiter-api", "mockk-android", "androidx_test_runner", "androidx_test_monitor", "androidx_test_uiautomator", "de-manodermaus-android-junit5"]
test = ["junit-jupiter-api", "mockk"]

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" }
app-versioning = { id = "io.github.reactivecircus.app-versioning", version.ref = "appversioning" }
de-mannodermaus-android-junit5 = { id = "de.mannodermaus.android-junit5", version.ref = "mannodermaus_junit5_plugin" }
dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
dotenv = { id = "co.uzzu.dotenv.gradle", version.ref = "dotenv" }
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
jetbrains-kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlinter = { id = "org.jmailen.kotlinter", version.ref = "kotlinter" }
kotlin-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }

My root project build.gradle.kts is:

plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.android.library) apply false
    alias(libs.plugins.app.versioning) apply false
    alias(libs.plugins.dotenv)
    alias(libs.plugins.jetbrains.kotlin.android) apply false
    alias(libs.plugins.jetbrains.kotlin.jvm) apply false
    alias(libs.plugins.kotlinter) apply false
    alias(libs.plugins.hilt) apply false
    alias(libs.plugins.de.mannodermaus.android.junit5) apply false
    alias(libs.plugins.dokka) apply false
    alias(libs.plugins.kotlin.ksp) apply false
}

Let me know if I can provide any further info.

compscidr avatar Jun 07 '24 18:06 compscidr