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?
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.