wake-up-neo.net

Android: Instrumentierungslauf fehlgeschlagen wegen 'Java.lang.ClassNotFoundException': Keine Tests gefunden

Ich versuche einen Instrumentationstest über "gradlew connectedAndroidTest" durchzuführen. Ich erhalte folgende Fehlermeldung:

Tests on GT-I9305 - 4.3 failed: Instrumentation run failed due to 'Java.lang.ClassNotFoundException'

com.Android.builder.testing.ConnectedDevice > hasTests[GT-I9305 - 4.3] FAILED 
No tests found.                              
:mobile:connectedAndroidTest FAILED 

Dies ist die Ausgabe mit der Option --stacktrace:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':mobile:connectedAndroidTest'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.Java:69)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.Java:46)
        at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.Java:35)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.Java:64)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.Java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.Java:42)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.Java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.Java:53)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.Java:43)
        at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.Java:305)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.Java:79)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.Java:63)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.Java:51)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.Java:23)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.Java:88)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.Java:29)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.Java:62)
        at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.Java:23)
        at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.Java:68)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.Java:32)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.Java:62)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.Java:55)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.Java:149)
        at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.Java:106)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.Java:86)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.Java:80)
        at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.Java:33)
        at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.Java:24)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.Java:36)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.Java:26)
        at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.Java:51)
        at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.Java:171)
        at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.Java:237)
        at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.Java:210)
        at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.Java:35)
        at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.Java:24)
        at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.Java:206)
        at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.Java:169)
        at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.Java:33)
        at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.Java:22)
        at org.gradle.launcher.Main.doAction(Main.Java:33)
        at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.Java:45)
        at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.Java:54)
        at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.Java:35)
        at org.gradle.launcher.GradleMain.main(GradleMain.Java:23)
        at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.Java:33)
        at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.Java:130)
        at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.Java:48)
Caused by: org.gradle.api.GradleException: There were failing tests. See the report at: file:///D:/myapp/mobile/build/outputs/reports/androidTests/connected/index.html
        at com.Android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.runTests(DeviceProviderInstrumentTestTask.groovy:92)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.Java:63)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.Java:218)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.Java:211)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.Java:200)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.Java:579)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.Java:562)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.Java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.Java:61)
        ... 47 more

Mein AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.myapp" >

    <instrumentation
        Android:targetPackage="com.example.myapp"
        Android:name="Android.test.InstrumentationTestRunner" />

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme"
        Android:name="com.example.myapp.MyApplication">
        <activity
            Android:name="com.example.myapp.MainActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <uses-library Android:name="Android.test.runner" />
    </application>

</manifest>

Mein build.gradle :

apply plugin: 'com.Android.application'
apply plugin: 'com.neenbedankt.Android-apt'
apply plugin: 'robolectric'

Android {
    compileSdkVersion 21
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 18
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "com.google.Android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        androidTest {
            setRoot('src/androidTest')
        }
        test {
            setRoot('src/test')
        }
    }
}

Android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
}
configurations {
    apt
}

apt {
    arguments {
        resourcePackageName Android.defaultConfig.packageName
        androidManifestFile variant.outputs[0].processResources.manifestFile
    }
}

ext {
    daggerVersion = '1.2.2';
    androidAnnotationsVersion = '3.2';
    robobindingVersion = '0.8.9';
    jodatimeVersion = '2.5.1';
    ormliteVersion = '4.48';
    ottoVersion = '1.3.5';
    commonsioVersion = '2.0.1';
    playservicesVersion = '6.1.71';
    supportv4Version = '21.0.2';
    javaxinjectVersion = '1';
    junitVersion = '4.11';
    robolectricVersion = '2.4';
}

dependencies {
    androidTestCompile files('lib/espresso-1.1.jar', 'lib/testrunner-1.1.jar', 'lib/testrunner-runtime-1.1.jar')
    androidTestCompile 'com.google.guava:guava:14.0.1'
    androidTestCompile 'com.squareup.dagger:dagger:1.2.2'
    androidTestCompile 'org.hamcrest:hamcrest-integration:1.1'
    androidTestCompile 'org.hamcrest:hamcrest-core:1.1'
    androidTestCompile 'org.hamcrest:hamcrest-library:1.1'

    androidTestCompile("junit:junit:${junitVersion}") {
        exclude module: 'hamcrest-core'
    }
    androidTestCompile("org.robolectric:robolectric:${robolectricVersion}") {
        exclude module: 'classworlds'
        exclude module: 'commons-logging'
        exclude module: 'httpclient'
        exclude module: 'maven-artifact'
        exclude module: 'maven-artifact-manager'
        exclude module: 'maven-error-diagnostics'
        exclude module: 'maven-model'
        exclude module: 'maven-project'
        exclude module: 'maven-settings'
        exclude module: 'plexus-container-default'
        exclude module: 'plexus-interpolation'
        exclude module: 'plexus-utils'
        exclude module: 'wagon-file'
        exclude module: 'wagon-http-lightweight'
        exclude module: 'wagon-provider-api'
    }

    androidTestCompile 'com.squareup:fest-Android:1.0.+'

    apt "org.robobinding:codegen:$robobindingVersion"
    compile("org.robobinding:robobinding:$robobindingVersion:with-dependencies") {
        exclude group: 'com.google.guava', module: 'guava'
    }
    apt "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
    compile "org.androidannotations:androidannotations-api:${androidAnnotationsVersion}"
    apt "com.squareup.dagger:dagger-compiler:${daggerVersion}"
    compile "com.squareup.dagger:dagger:${daggerVersion}"
    compile fileTree(dir: 'libs', include: ['*.jar'])
    wearApp project(':wear')
    compile project(':javamail')
    compile "com.google.Android.gms:play-services:${playservicesVersion}"
    compile "com.Android.support:support-v4:${supportv4Version}"
    compile "com.squareup:otto:${ottoVersion}"
    compile "javax.inject:javax.inject:${javaxinjectVersion}"
    compile "com.j256.ormlite:ormlite-core:${ormliteVersion}"
    compile "com.j256.ormlite:ormlite-Android:${ormliteVersion}"
    compile group: 'commons-io', name: 'commons-io', version: "${commonsioVersion}"
    compile "net.danlew:Android.joda:${jodatimeVersion}"
}

apply plugin: 'idea'
idea {
    module {
        testOutputDir = file('build/test-classes/debug')
    }
}


Android.applicationVariants.all { variant ->
    def aptOutput = file("${project.buildDir}/generated/source/apt/${variant.dirName}")
    println "****************************"
    println "variant: ${variant.name}"
    println "manifest:  ${variant.processResources.manifestFile}"
    println "aptOutput:  ${aptOutput}"
    println "****************************"

    variant.javaCompile.doFirst {
        println "*** compile doFirst ${variant.name}"
        aptOutput.mkdirs()
        variant.javaCompile.options.compilerArgs += [
                '-processorpath', configurations.apt.getAsPath(),
                '-AandroidManifestFile=' + variant.processResources.manifestFile,
                '-s', aptOutput
        ]
    }
}

Meine Testklasse :

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public MainActivityTest() {
        super(MainActivity.class);
    }

    public void testSomething() {
        assertTrue(true);
    }

}    

Irgendeine Idee?

25
user2368140

Ich habe gerade das gleiche Problem gefunden und es durch ein Update auf Espresso 2.0 gelöst

Ersetzen Sie den testInstrumentationRunner in Ihrer build.gradle-Datei

 testInstrumentationRunner "com.google.Android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner

zu

testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"

und aktualisieren Sie die neuen Abhängigkeiten auf 2.0

androidTestCompile files('lib/espresso-1.1.jar', 'lib/testrunner-1.1.jar', 'lib/testrunner-runtime-1.1.jar')

zu

androidTestCompile 'com.Android.support.test:testing-support-lib:0.1'
androidTestCompile 'com.Android.support.test.espresso:espresso-core:2.0'

Sie müssen auch den Namespace in Ihren Tests ändern. Sie werden dies jedoch beim Ausführen feststellen.

Vollständige Erklärung: https://code.google.com/p/Android-test-kit/wiki/EspressoSetupInstructions

Bearbeiten:

Anscheinend habe ich zu früh geantwortet, die Antwort, die ich gepostet habe, hat sie nur auf 5.0-Geräten behoben. Im Folgenden wurde das Problem bei älteren Geräten behoben:

Schließen Sie javax.inject von der neuen Abhängigkeit aus, indem Sie Folgendes ändern:

androidTestCompile 'com.Android.support.test.espresso:espresso-core:2.0'

zu

androidTestCompile('com.Android.support.test.espresso:espresso-core:2.0') {
    exclude group: 'javax.inject'
}

source: Dolchcode, der NoClassDefFoundError angibt, wenn Espresso-Tests ausgeführt werden, normaler Lauf funktioniert einwandfrei

21
Lauw

Ich habe dieses Problem bekommen, als ich einen Test in Kotlin geschrieben habe und Leerzeichen im Methodennamen verwendet habe. Es stürzt mit der Fehlermeldung ab: Java.lang.ClassNotFoundException: Didn't find class "Android.support.test.runner.AndroidJUnitRunner"

In Android Studio: No tests where found

Defekter Test: Leerzeichen in Methodennamen, funktioniert nicht auf Android

class RandomTest {

    @Test
    fun `do not use spaces it will not work on Android devices or emulators`() {
        assertThat(2 + 2).isEqualTo(4)
    }
}

Lösung: Leerzeichen entfernt, alles normal kompiliert

class RandomTest {

    @Test
    fun write_method_names_Java6_compatible_without_spaces() {
        assertThat(2 + 2).isEqualTo(4)
    }
}

Dies kann passieren, weil ich die Inspection "Illegal Android Identifier" deaktiviert habe, um mich beim Schreiben von JVM-Tests nicht zu stören

5
passsy

Antwort aus Originalantwort kopieren .

Dies ist mir in meinem Projekt aufgefallen, in meinem App (Haupt) -Modul build.gradle hatte ich die folgende buildType-Konfiguration

buildTypes {
        debug {
            multiDexEnabled true
        }

        mock {
            initWith(buildTypes.debug)
        }
    }
testBuildType "mock"

Wenn ich AndroidJUnitRunner als Testläufer (beide von Android Studio) und als testInstrumentationRunner in build.gradle verwendet habe, liefen die Tests problemlos.

In einem Untermodul mit multiDexEnabled true als defaultConfig

defaultConfig {
    multiDexEnabled true
    ....
}

Ich stieß auf das Problem von 

Test running startedTest running failed: Unable to find instrumentation info for:{mypackage.x.y/Android.support.test.runner.AndroidJUnitRunner"}

wenn ich AndroidJUnitRunner in IDE und das Untermodul build.gradle angegeben habe. Dies wurde behoben, indem MultiDexTestRunner als Testläufer in IDE/build.gradle angegeben wurde.

Zusammenfassend können Sie mit MultiDexTestRunner Tests ausführen, wenn multiDexEnabled true in build.gradle angegeben ist. Andernfalls verwenden Sie AndroidJUnitRunner als Testlauf.

2
Agnit

Ich bin gerade auf dieses Problem gestoßen, als ich nach einigem Refactoring versuchte, den Test von der Konsole aus auszuführen.

Die Lösung bestand darin, die AndroidManifest.xml zu korrigieren, da sie Verweise auf nicht mehr vorhandene Aktivitäten und andere Klassen enthielt.

Sicher, das Projekt wird mit einem fehlerhaften Manifest kompiliert, aber wenn Sie versuchen, es auszuführen, kann das Gerät die definierten Klassen nicht finden. Also die ClassNotFoundException.

2
zsolt.kocsi

Ich war mit einem ähnlichen Problem konfrontiert. In meinem Projekt gab es mehrere Module und Multidex wurde aktiviert. Für mich bestand das Problem darin, dass in einem bestimmten Modul die Option multidex enable (multiDexEnabled true) fehlte.

Im Hauptmodul (App) sah das build.gradle folgendermaßen aus:

...
multiDexEnabled true
testInstrumentationRunner "com.Android.test.runner.MultiDexTestRunner"
...

In einem anderen Modul (von dem die App abhängig ist) fehlte in build.gradle die Zeile "multiDexEnabled". Durch das Hinzufügen dieser Zeile wurde das Problem behoben.

2
Paul

Das Problem für mich war, den Test in Kotlin hinzuzufügen, aber vorher keinen Kotlin-Support zu haben. Also muss ich meinen Abschluss machen:

apply plugin: 'kotlin-Android'

Löschen Sie dann die Testkonfiguration und fügen Sie sie erneut hinzu.

2

Ich habe dieses Problem gelöst, indem ich den Proguard ausgeschaltet habe.