test example activity android gradle robolectric

android - example - Robolectric con Gradle: Recursos no encontrados



robolectric activity test (2)

Estoy intentando ejecutar mis pruebas de Robolectric junto con el nuevo sistema de compilación de Gradle Android, pero estoy estancado al acceder a los recursos de mi proyecto principal.

Dividí la construcción en dos proyectos separados para evitar conflictos entre los plugins android gradle de java , por lo que la estructura del directorio se ve más o menos así:

. ├── build.gradle ├── settings.gradle ├── mainproject │   ├── build │   │   ├── classes │   │   │   └── debug │   ├── build.gradle │   └── src │   └── main │   ├── AndroidManifest.xml │   └── ... └── test ├── build.gradle └── src    └── test    └── java    └── ...    └── test    ├── MainActivityTest.java    ├── Runner.java    ├── ServerTestCase.java    └── StatusFetcherTest.java

Mi build.gradle in test/ actualmente se ve así:

buildscript { repositories { mavenCentral() } dependencies { classpath ''com.stanfy.android:gradle-plugin-java-robolectric:2.0'' } } apply plugin: ''java-robolectric'' repositories {...} javarob { packageName = ''com.example.mainproject'' } test { dependsOn '':mainproject:build'' scanForTestClasses = false include "**/*Test.class" // Oh, the humanity! def srcDir = project('':mainproject'').android.sourceSets.main.java.srcDirs.toArray()[0].getAbsolutePath() workingDir srcDir.substring(0, srcDir.lastIndexOf(''/'')) } project('':mainproject'').android.sourceSets.main.java.srcDirs.each {dir -> def buildDir = dir.getAbsolutePath().split(''/'') buildDir = (buildDir[0..(buildDir.length - 4)] + [''build'', ''classes'', ''debug'']).join(''/'') sourceSets.test.compileClasspath += files(buildDir) sourceSets.test.runtimeClasspath += files(buildDir) } dependencies { testCompile group: ''com.google.android'', name: ''android'', version: ''4.1.1.4'' testCompile group: ''org.robolectric'', name: ''robolectric'', version: ''2.0-alpha-3'' ... }

El hacker de classpath malvado me permite acceder a todas las clases de mi proyecto principal, excepto R , que existe como archivo .class en el directorio de compilación, pero plantea este error durante la tarea compileTestJava :

/.../MainActivityTest.java:16: error: cannot find symbol final String appName = activity.getResources().getString(R.string.app_name); ^ symbol: variable string location: class R 1 error :test:compileTestJava FAILED

Debe haber una mejor manera de ejecutar pruebas de Robolectric con el nuevo sistema de compilación, ¿verdad?

( Fuente completa de la aplicación )


Me encontré con este mismo problema y esto es lo que se me ocurrió. En lugar de crear un proyecto separado para las pruebas, creé un conjunto fuente para las pruebas de Robolectric y agregué una nueva tarea de la que dependería la "comprobación". Usando algo del código de su pregunta, aquí están los bits relevantes del archivo de compilación (de trabajo):

apply plugin: ''android'' sourceSets { testLocal { java.srcDir file(''src/test/java'') resources.srcDir file(''src/test/resources'') } } dependencies { compile ''org.roboguice:roboguice:2.0'' compile ''com.google.android:support-v4:r6'' testLocalCompile ''junit:junit:4.8.2'' testLocalCompile ''org.robolectric:robolectric:2.1'' testLocalCompile ''com.google.android:android:4.0.1.2'' testLocalCompile ''com.google.android:support-v4:r6'' testLocalCompile ''org.roboguice:roboguice:2.0'' } task localTest(type: Test, dependsOn: assemble) { testClassesDir = sourceSets.testLocal.output.classesDir android.sourceSets.main.java.srcDirs.each { dir -> def buildDir = dir.getAbsolutePath().split(''/'') buildDir = (buildDir[0..(buildDir.length - 4)] + [''build'', ''classes'', ''debug'']).join(''/'') sourceSets.testLocal.compileClasspath += files(buildDir) sourceSets.testLocal.runtimeClasspath += files(buildDir) } classpath = sourceSets.testLocal.runtimeClasspath } check.dependsOn localTest

He incluido mi bloque de dependencias para señalar que, para poder ponerlo en funcionamiento, tuve que repetir todas mis dependencias de compile en mi conjunto fuente original de testLocal .

Al gradle testLocal y ejecuta solo las pruebas dentro de src/test/java , mientras se ejecuta la gradle check ejecutan estas pruebas además de las del conjunto de origen del test android instrumentTest predeterminado.

¡Espero que esto ayude!


Actualización: Jake Wharton acaba de anunciar el gradle-android-test-plugin . Puede encontrarlo en gradle-android-test-plugin

Parece bastante simplificado, especialmente si planea usar robolectric .

Vieja respuesta a continuación

El robolectric-plugin parece prometedor.

El archivo build.gradle ejemplo que proporcionan es:

buildscript { repositories { mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } dependencies { classpath ''com.android.tools.build:gradle:0.4.2'' classpath ''com.novoda.gradle:robolectric-plugin:0.0.1-SNAPSHOT'' } } apply plugin: ''android'' apply plugin: ''robolectric'' repositories { mavenCentral() mavenLocal() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } dependencies { //compile files(''libs/android-support-v4.jar'') // had to deploy to sonatype to get AAR to work compile ''com.novoda:actionbarsherlock:4.3.2-SNAPSHOT'' robolectricCompile ''org.robolectric:robolectric:2.0'' robolectricCompile group: ''junit'', name: ''junit'', version: ''4.+'' } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { minSdkVersion 7 targetSdkVersion 17 } }

No parece funcionar con la versión 0.5 de Android Gradle, pero tal vez lo haga pronto.