Prueba de la unidad de Android Studio: archivo de datos leídos (entrada)

En una prueba unitaria, ¿cómo puedo leer los datos de un archivo json en mi sistema de archivos (de escritorio) sin codificar el camino?

Me gustaría leer la entrada de prueba (para mis métodos de análisis) desde 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 ubicarlo en otro lugar del proyecto si es necesario. Estoy usando Android Studio.

Según la versión de android-gradle-plugin :

1. versión 1.5 y superior:

Simplemente ponga 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 gradle.

2. versión por debajo de 1.5 : (o si por algún motivo la solución anterior no funciona)

  1. Asegúrese de utilizar al menos Android Gradle Plugin versión 1.1 . Siga el enlace para configurar Android Studio correctamente.

  2. Crear directorio de test . Coloque las clases de prueba unitaria en el directorio java y coloque su archivo de recursos en el directorio res . Android Studio debería marcarlos de la siguiente manera:

    enter image description here

  3. Cree gradle tarea gradle para copiar recursos en el directorio de clases para hacerlos visibles para el classloader de classloader :

     android{ ... } task copyResDirectoryToClasses(type: Copy){ from "${projectDir}/src/test/res" into "${buildDir}/intermediates/classes/test/debug/res" } assembleDebug.dependsOn(copyResDirectoryToClasses) 
  4. Ahora puede usar este método para obtener 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()); } 
  5. Ejecute la prueba unitaria mediante Ctrl + Shift + F10 en toda la clase o método de prueba specyfic.

Para las pruebas de unidad local (frente a las pruebas de instrumentación), puede colocar los archivos bajo 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
  • plugin de gradle 1.3.1

En mi caso, la solución fue agregar al archivo gradle

 sourceSets { test.resources.srcDirs += 'src/unitTests/resources' } 

Después de todo, todo fue encontrado por AS 2.3.1

 javaClass.classLoader.getResourceAsStream("countries.txt") 

Si va a Ejecutar -> Editar configuraciones -> JUnit y luego selecciona la configuración de ejecución para las pruebas de su unidad, hay una configuración de ‘Directorio de trabajo’. Eso debería apuntar a donde esté tu archivo json. Tenga en cuenta que esto podría romper otras pruebas.

He tenido muchos problemas con los recursos de prueba en Android Studio, así que configuré algunas pruebas para mayor claridad. En mi proyecto de mobile (aplicación 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 la línea de comando con ./gradlew data:test . Para evitarlo utilizo 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