web-dev-qa-db-fra.com

Android: Echec de l'exécution de l'instrumentation en raison de 'Java.lang.ClassNotFoundException': Aucun test trouvé

J'essaie d'exécuter un test d'instrumentation via "gradlew connectedAndroidTest". Je reçois l'erreur suivante:

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 

Voici la sortie avec l'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

Mon 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>

Mon 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
        ]
    }
}

Ma classe de test :

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

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

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

}    

Une idée?

25
user2368140

Je viens de me retrouver avec le même problème et je l'ai résolu en mettant à jour espresso 2.0.

Remplacez testInstrumentationRunner dans votre fichier build.gradle

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

à

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

et mettre à jour les nouvelles dépendances à 2.0

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

à

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

Vous devez également modifier l'espace de nom dans vos tests, mais vous remarquerez que vous les exécutez.

Explication complète: https://code.google.com/p/Android-test-kit/wiki/EspressoSetupInstructions

Modifier:

Il semble que j'ai été trop tôt pour répondre, la réponse que j'ai postée l'a seulement corrigée sur les appareils 5.0. Vous trouverez ci-dessous ce qui a été corrigé sur des appareils plus anciens:

Exclut javax.inject de la nouvelle dépendance en modifiant:

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

à

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

source: Code de poignard donnant NoClassDefFoundError lors de l'exécution de tests Espresso, l'exécution normale fonctionne correctement

21
Lauw

J'ai eu ce problème quand j'ai écrit un test dans Kotlin et utilisé des espaces dans le nom de la méthode. Il se bloque avec le message d'erreur: Java.lang.ClassNotFoundException: Didn't find class "Android.support.test.runner.AndroidJUnitRunner"

Dans Android Studio: No tests where found

Test cassé: Espaces dans les noms de méthodes, ne fonctionne pas sur Android

class RandomTest {

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

Solution: Espaces supprimés, tout se compile normalement

class RandomTest {

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

Cela peut arriver parce que j'ai désactivé l'inspection "Identifiant Android illégal" afin de ne pas m'ennuyer lors de l'écriture de tests JVM.

5
passsy

Copier la réponse de Réponse originale .

C’est ce que j’ai remarqué dans mon projet: dans mon module d’application (principal), build.gradle, j’avais la configuration buildType suivante.

buildTypes {
        debug {
            multiDexEnabled true
        }

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

Lorsque j'ai utilisé AndroidJUnitRunner en tant que lanceur de tests (à partir d'Android Studio) et en tant que testInstrumentationRunner dans build.gradle, les tests se sont déroulés sans accroc.

Dans un sous-module comportant multiDexEnabled true as defaultConfig

defaultConfig {
    multiDexEnabled true
    ....
}

Je suis tombé sur le problème de 

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

lorsque j'ai spécifié AndroidJUnitRunner dans IDE et le sous-module build.gradle. Et cela a été corrigé en spécifiant MultiDexTestRunner en tant qu'exécutant de test dans IDE/build.gradle.

Pour résumer, utilisez MultiDexTestRunner pour exécuter des tests lorsque multiDexEnabled true est spécifié dans le fichier build.gradle. Sinon, utilisez AndroidJUnitRunner comme exécuteur de test.

2
Agnit

Je viens de rencontrer ce problème quand, après un certain refactoring, j'ai essayé de lancer un test depuis la console.

La solution consistait à réparer le fichier AndroidManifest.xml, car il contenait des références à des activités et à d'autres classes qui n'existaient plus.

Bien sûr, le projet compilera avec un manifeste incorrect, mais lorsque vous essayez de l'exécuter, le périphérique ne trouvera pas les classes définies. Ainsi, la ClassNotFoundException.

2
zsolt.kocsi

J'avais affronté le même problème. Dans mon projet, il y avait plusieurs modules et multidex a été activé. Pour moi, le problème était dans un module particulier, l'option d'activation multidex (multiDexEnabled true) était manquante.

Dans le module principal (app), le build.gradle était comme suit:

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

Dans un autre module (dont l'application dépend), la ligne "multiDexEnabled true" manquait dans le fichier build.gradle. L'ajout de cette ligne a résolu le problème.

2
Paul

J'ai résolu ce problème en éteignant le Proguard.