En una prueba unitaria, ¿cómo puedo leer datos de un archivo json en mi sistema de archivos (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 mi código de prueba de unidad, pero también puedo colocarlo en otro lugar del proyecto si es necesario. Estoy usando Android Studio.
android
unit-testing
android-studio
Franco
fuente
fuente
test_documents.json
? directorio de activos?Respuestas:
Dependiendo de la
android-gradle-plugin
versión:1. versión 1.5 y superior:
Simplemente coloque el archivo json
src/test/resources/test.json
y haga referencia a él comoNo se necesita ninguna 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 que está utilizando al menos la versión 1.1 del complemento Gradle de Android . Siga el enlace para configurar Android Studio correctamente.
Crear
test
directorio. Coloque las clases de prueba unitaria en eljava
directorio y coloque su archivo de recursos en elres
directorio. Android Studio debería marcarlos como sigue:Cree una
gradle
tarea para copiar recursos en el directorio de clases para hacerlos visibles paraclassloader
:Ahora puede usar este método para obtener una
File
referencia para el recurso de archivo:fuente
src/test/resources/test.json
y haga referencia a él comoclassLoader.getResource("test.json")
. No se necesita ninguna modificación de Gradle. Las carpetas anidadas en el interiorresources
también funcionan.classLoader
? ¿Dónde colocar esta línea de código? ¿Qué puedes hacer con el resultado devuelto? Proporcione un código más completo. -1./src/test/resources/file.txt
en Kotlin:TestClassName::class.java.getResource("/file.txt")!!.readText()
Para las pruebas de unidades locales (frente a las pruebas de instrumentación), puede colocar archivos debajo
src/test/resources
y leerlos usando classLoader. Por ejemplo, el siguiente código abre unmyFile.txt
archivo en el directorio de recursos.Funcionó con
fuente
val myFile = ClassLoader.getSystemResource("myFile.txt").readText()
En mi caso, la solución fue agregar al archivo gradle
Después de eso, todo fue encontrado por AS 2.3.1
fuente
root/app/src/test/resources/test.json
2. leer datos como este:val jsonFile = ClassLoader.getSystemResource("test.json").readText()
Tuve 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:La clase de prueba (todas las pruebas pasan):
En el mismo proyecto raíz tengo un proyecto de Java (no de Android) llamado
data
. Si agrego los mismos archivos al proyecto de datos: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, uso este truco (en Groovy)Uso:
resource('/test.txt')
Android Studio 2.3, Gradle 3.3
fuente
getClassLoader()
versiones funcionan como se esperaba. Es decir, encuentran los archivos, ambos se ejecutan desde Android Studio Y desde la línea de comando en mi máquina macOS, y en el servidor CI de Linux (CircleCI). Así que voy con eso y espero que Gradle 3.3 no lo rompa más tarde ...build/resources/test
no están incluidas en la ruta de clases interactiva.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.
fuente
new File()
o similar, pero no funciona directamente con el método de carga de classpath descrito anteriormente. También es un poco complicado porque cada nueva configuración de ejecución necesita establecer el directorio de trabajo y, de forma predeterminada, a la línea de comandos de AS y Gradle les gusta usar diferentes directorios de trabajo ... un dolorPensé que debería agregar mis hallazgos aquí. Sé que esto es un poco antiguo, pero para las versiones más recientes de Gradle, donde NO hay directorio src / test / resources, pero solo un directorio de recursos para todo el proyecto, debes agregar esta línea a tu archivo Gradle.
Al hacer esto, puede acceder a su recurso con:
He estado buscando esto y no pude encontrar una respuesta, así que decidí ayudar a otros aquí.
fuente
En realidad, esto es lo que me funcionó con las pruebas de instrumentación (ejecución de Android Studio versión 3.5.3 , Android Gradle Plugin versión 3.5.3 , Gradle versión 6.0.1 ):
src/androidTest/assets
carpetaInputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open("filename.txt");
fuente