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?
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'
}
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.
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.
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.
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.
J'ai résolu ce problème en éteignant le Proguard.