studio permission name manifests internet exported definicion cleartaskonlaunch activity access_superuser android unit-testing android-studio

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)

  1. Asegúrese de utilizar al menos tools.android.com/tech-docs/unit-testing-support . Sigue el enlace para configurar Android Studio correctamente.

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

  3. Cree gradle tarea gradle para copiar recursos en el directorio de clases para que sean 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 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()); }

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