testing - studio - unit test android
Android: la ejecución de la instrumentación falló debido a ''java.lang.ClassNotFoundException'': no se encontraron pruebas (5)
Intento ejecutar una prueba de instrumentación a través de "gradlew connectedAndroidTest". Me aparece el siguiente error:
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
Esta es la salida con la opción --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
Mi 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>
Mi 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
]
}
}
Mi clase de prueba :
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
public MainActivityTest() {
super(MainActivity.class);
}
public void testSomething() {
assertTrue(true);
}
}
¿Alguna idea?
Acabo de encontrarme con este problema cuando, después de algunas refactorizaciones, intenté ejecutar la prueba desde la consola.
La solución fue arreglar el AndroidManifest.xml, ya que contenía referencias a actividades ya existentes y otras clases.
Claro, el proyecto se compilará con un manifiesto incorrecto, pero cuando intente ejecutarlo, el dispositivo no encontrará las clases definidas. Por lo tanto, la ClassNotFoundException.
Copiando la respuesta de la Respuesta Original .
Esto es lo que noté en mi proyecto, en mi aplicación (principal) module build.gradle tuve la siguiente configuración buildType
buildTypes {
debug {
multiDexEnabled true
}
mock {
initWith(buildTypes.debug)
}
}
testBuildType "mock"
Cuando utilicé AndroidJUnitRunner como el corrector de prueba (ambos de Android Studio) y como testInstrumentationRunner en build.gradle, las pruebas se ejecutaron sin problemas.
En un submódulo que tenía multiDexEnabled true como defaultConfig
defaultConfig {
multiDexEnabled true
....
}
Me encontré con el problema de
Test running startedTest running failed: Unable to find instrumentation info for:{mypackage.x.y/android.support.test.runner.AndroidJUnitRunner"}
cuando especifiqué AndroidJUnitRunner en IDE y en el submódulo build.gradle. Y esto se solucionó especificando MultiDexTestRunner como el corredor de prueba en IDE / build.gradle.
Para resumir, use MultiDexTestRunner para ejecutar pruebas cuando se especifica multiDexEnabled true en build.gradle, sino use AndroidJUnitRunner como el corredor de prueba.
Me encontré con el mismo problema y lo resolví actualizando a espresso 2.0
Reemplace testInstrumentationRunner en su archivo build.gradle
testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner
a
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
y actualice las nuevas dependencias a 2.0
androidTestCompile files(''lib/espresso-1.1.jar'', ''lib/testrunner-1.1.jar'', ''lib/testrunner-runtime-1.1.jar'')
a
androidTestCompile ''com.android.support.test:testing-support-lib:0.1''
androidTestCompile ''com.android.support.test.espresso:espresso-core:2.0''
También debe cambiar el espacio de nombre en sus pruebas, pero se dará cuenta al ejecutarlas.
Explicación completa: https://code.google.com/p/android-test-kit/wiki/EspressoSetupInstructions
Editar:
Parece que era demasiado pronto para responder, la respuesta que publiqué solo la corrigió en dispositivos 5.0. A continuación se muestra lo que lo solucionó en dispositivos más antiguos:
Excluya javax.inject de la nueva dependencia cambiando:
androidTestCompile ''com.android.support.test.espresso:espresso-core:2.0''
a
androidTestCompile(''com.android.support.test.espresso:espresso-core:2.0'') {
exclude group: ''javax.inject''
}
Me enfrenté a un problema similar. En mi proyecto había múltiples módulos y se habilitó multidex. Para mí, el problema estaba en un módulo particular opción de habilitación multidex (multiDexEnabled true) que faltaba.
En el módulo principal (aplicación) build.gradle era como seguir:
...
multiDexEnabled true
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
...
En otro módulo (de qué aplicación depende), a build.gradle le faltaba la línea "multiDexEnabled true". Agregar esta línea resolvió el problema.
Obtuve este problema cuando escribí una prueba en Kotlin y usé espacios en el nombre del método. Se bloquea con el mensaje de error: java.lang.ClassNotFoundException: Didn''t find class "android.support.test.runner.AndroidJUnitRunner"
En Android Studio: No tests where found
Prueba rota: espacios en nombres de métodos, no funciona en Android
class RandomTest {
@Test
fun `do not use spaces it will not work on Android devices or emulators`() {
assertThat(2 + 2).isEqualTo(4)
}
}
Solución: espacios eliminados, todo se compila normalmente
class RandomTest {
@Test
fun write_method_names_java6_compatible_without_spaces() {
assertThat(2 + 2).isEqualTo(4)
}
}
Esto podría suceder porque desactivé el "Identificador ilegal de Android" de inspección para que no me moleste cuando escribo pruebas JVM.