manifests - user permission android name android permission internet/>
Prueba de unidad de Android Studio: leer el archivo de datos(entrada) (6)
En una prueba unitaria, ¿cómo puedo leer datos de un archivo json en mi sistema de archivos (de escritorio), sin codificar la ruta?
Me gustaría leer la entrada de prueba (para mis métodos de análisis) de un archivo en lugar de crear cadenas estáticas.
El archivo está en la misma ubicación que el código de prueba de mi unidad, pero también puedo colocarlo en otro lugar del proyecto si es necesario. Estoy usando Android Studio.
Dependiendo de la versión del
android-gradle-plugin
:
1. versión 1.5 y superior:
Simplemente coloque el archivo json en
src/test/resources/test.json
y
src/test/resources/test.json
referencia a él como
classLoader.getResource("test.json").
No se necesita modificación de gradle.
2. versión inferior a 1.5 : (o si por alguna razón la solución anterior no funciona)
-
Asegúrese de utilizar al menos tools.android.com/tech-docs/unit-testing-support . Sigue el enlace para configurar Android Studio correctamente.
-
Crear directorio de
test
. Ponga las clases de prueba de unidad en el directorio dejava
y coloque su archivo de recursos en el directoriores
. Android Studio debería marcarlos de la siguiente manera: -
Cree
gradle
tareagradle
para copiar recursos en el directorio de clases para que sean visibles para elclassloader
declassloader
:android{ ... } task copyResDirectoryToClasses(type: Copy){ from "${projectDir}/src/test/res" into "${buildDir}/intermediates/classes/test/debug/res" } assembleDebug.dependsOn(copyResDirectoryToClasses)
-
Ahora puede usar este método para obtener una referencia de
File
para el recurso de archivo:private static File getFileFromPath(Object obj, String fileName) { ClassLoader classLoader = obj.getClass().getClassLoader(); URL resource = classLoader.getResource(fileName); return new File(resource.getPath()); } @Test public void fileObjectShouldNotBeNull() throws Exception { File file = getFileFromPath(this, "res/test.json"); assertThat(file, notNullValue()); }
- Ejecute la prueba de unidad con Ctrl + Shift + F10 en toda la clase o método de prueba específica.
En mi caso, la solución fue agregar al archivo gradle
sourceSets {
test.resources.srcDirs += ''src/unitTests/resources''
}
Después de eso, todo fue encontrado por AS 2.3.1
javaClass.classLoader.getResourceAsStream("countries.txt")
He tenido muchos problemas con los recursos de prueba en Android Studio, así que configuré algunas pruebas para mayor claridad.
En mi proyecto
mobile
(Aplicación de Android) agregué los siguientes archivos:
mobile/src/test/java/test/ResourceTest.java
mobile/src/test/resources/test.txt
mobile/src/test/resources/test/samePackage.txt
La clase de prueba (todas las pruebas pasan):
assertTrue(getClass().getResource("test.txt") == null);
assertTrue(getClass().getResource("/test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getResource("samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getResource("/test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getClassLoader().getResource("test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getClassLoader().getResource("test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
En el mismo proyecto raíz tengo un proyecto
Java (no Android)
llamado
data
.
Si agrego los mismos archivos al proyecto de datos:
data/src/test/java/test/ResourceTest.java
data/src/test/resources/test.txt
data/src/test/resources/test/samePackage.txt
Entonces, todas las pruebas anteriores fallarán si las ejecuto desde Android Studio, pero pasan en la línea de comando con
./gradlew data:test
.
Para evitarlo, uso este truco (en Groovy)
def resource(String path) {
getClass().getResource(path) ?:
// Hack to load test resources when executing tests from Android Studio
new File(getClass().getClassLoader().getResource(''.'').path
.replace(''/build/classes/test/'', "/build/resources/test$path"))
}
Uso:
resource(''/test.txt'')
Android Studio 2.3, Gradle 3.3
Para las pruebas unitarias locales (frente a las pruebas de instrumentación), puede colocar archivos en
src/test/resources
y leerlos usando classLoader.
Por ejemplo, el siguiente código abre el archivo
myFile.txt
en el directorio de recursos.
InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");
Funcionó con
- Android Studio 1.5.1
- Gradle Plugin 1.3.1
Pensé que debería agregar mis hallazgos aquí. Sé que esto es un poco antiguo, pero para las versiones más nuevas de Gradle, donde NO hay un directorio src / test / resources, sino solo un directorio de recursos único para todo el proyecto, debe agregar esta línea a su archivo Gradle.
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
Al hacer esto, puede acceder a su recurso con:
this.getClass().getClassLoader().getResourceAsStream(fileName);
He estado buscando esto y no pude encontrar una respuesta, así que decidí ayudar a otros aquí.
Si va a Ejecutar -> Editar configuraciones -> JUnit y luego selecciona la configuración de ejecución para sus pruebas unitarias, hay una configuración de ''Directorio de trabajo''. Eso debería apuntar a donde sea que esté su archivo json. Tenga en cuenta que esto podría romper otras pruebas.