Cómo leer un archivo solo de prueba en la prueba de unidad de Android

Para mi aplicación de Android, estoy escribiendo pruebas de unidad que requieren leer algunos archivos. Dado que son sólo archivos de prueba, no los quiero en mis carpetas res ya que no quiero que terminen en mi archivo final .apk .

Quiero hacer algo similar a esta pregunta, pero utilizando el recién agregado (en Gradle 1.1) unidad de prueba de apoyo (en contraposición a la prueba de instrumentación).

Mi estructura de proyecto es la siguiente:

 /app /src /main /java/my.module/myClass.java /res/production_resources_go_here /test /java/my.module/myClassTest.java /resources/testFile.txt 

¿Cómo debería ser mi prueba myClassTest para poder leer correctamente el testFile.txt ?

4 Solutions collect form web for “Cómo leer un archivo solo de prueba en la prueba de unidad de Android”

En el momento en que se hizo esta pregunta, simplemente no estaba funcionando. Afortunadamente esto se ha solucionado desde entonces.

Usted tiene que poner su archivo de texto en la carpeta app/src/test/resources como el OP estaba tratando de hacer. Además, tiene que estar en el mismo paquete que su clase de prueba. Por lo tanto, si tiene ReadFileTest.java en el paquete com.example.test en la com.example.test app/src/test/java , el archivo de prueba debe estar en app/src/test/resources/com/example/test .

Estructura de la carpeta de prueba

A continuación, puede llegar a su archivo de texto como este:

 getClass().getResourceAsStream("testFile.txt") 

Esto abre un InputStream para el archivo de texto. Si no está seguro de qué hacer con él, he aquí algunas de las muchas maneras en que podría usarlo: Leer / convertir un InputStream en una cadena

Añada esto a su build.gradle:

 android { sourceSets { test { resources.srcDirs += ['src/test/resources'] } androidTest { resources.srcDirs += ['src/androidTest/resources'] } } } 

Para que los recursos sean accesibles mediante pruebas unitarias, agregue sus archivos en: src/test/resources . Y para las pruebas de instrumentación, agregue sus archivos en: src/androidTest/resources .

Estoy trabajando en un proyecto con una estructura similar a lo que usted mencionó. Puse todas mis respuestas de servidor en un archivo en resources carpeta de resources como app/src/test/resources/BookingInfo.json .

Todos los archivos de prueba de java están bajo app/src/test/java/PACKAGE_NAME similar a lo que usted dijo. Tengo una clase Fixture en un paquete que contiene el nombre de los recursos:

 @SuppressWarnings("nls") public final class Fixtures { public static final String GET_ANNOUNCEMENT = "GetAnnouncement.json"; ... } 

Y finalmente una clase FixtureUtils que un método de esta clase es responsable de leer el archivo de recursos y devolver el resultado.

 import java.nio.file.Files; import java.nio.file.Paths; public class FixtureUtils { public static final AFixture fixtureFromName(final String fixtureName) { final String fixtureString = FixtureUtils.stringFromAsset(fixtureName); if (StringUtils.isEmpty(fixtureString)) { return null; } final Gson gson = new Gson(); final AFixture aFixture = gson.fromJson(fixtureString, AFixture.class); return aFixture; } private static final String stringFromAsset(final String filename) { try { final URL resourceURL = ClassLoader.getSystemResource(filename); if (resourceURL == null) { return null; } final String result = new String(Files.readAllBytes(Paths.get(resourceURL.toURI())), Charset.forName("UTF-8")); //$NON-NLS-1$ return result; } catch (final Exception e) { e.printStackTrace(); } return null; } private FixtureUtils() { // Ensure Singleton } } 

Y la clase AFixture parece a:

 public class AFixture { public List<JsonElement> validItems; public List<JsonElement> invalidItems; public AFixture() { super(); } public List<JsonElement> getInvalidItems() { return this.invalidItems; } public List<JsonElement> getValidItems() { return this.validItems; } public void setInvalidItems(final List<JsonElement> invalidItems) { this.invalidItems = invalidItems; } public void setValidItems(final List<JsonElement> validItems) { this.validItems = validItems; } } 

Nota : java.nio.file se ha quitado de JDK8 si no me equivoco sin embargo usted no tiene ningún problema si usted está utilizando JDK7. Si está utilizando JDK8 entonces sólo tiene que cambiar el método stringFromAsset de tal manera como FileInputStream (estilo de moda antigua) o escáner .

Un ejemplo de una manera correcta de hacer esto sería poner el archivo en su carpeta de activos. Sin embargo, el contenido de la carpeta de activos se agregará al apk.

 InputStream is = resources.getAssets().open("test.txt"); 

Puedes engañar este sistema y atravesar cualquier otro archivo de tu proyecto. Asegúrese de crear un directorio de activos en la ubicación especificada en el archivo iml del proyecto (por ejemplo, src / main / assets).

 InputStream is = resources.getAssets().open("../../test/resources/testFile.txt"); 

Un ejemplo de una manera de obtener recursos sería:

 Resources resources = new Activity().getResources(); 
  • Autogenerar stubs de prueba de unidad en Android studio
  • El uso de InstrumentationTestRunner personalizado en Eclipse provoca un error
  • Excepción que ejecuta pruebas de JUnit con AndroidStudio: java.lang.NoClassDefFoundError: android / os / Parcelable
  • PowerMock en el proyecto Android
  • Mocking un campo inyectado en las pruebas unitarias
  • ¿Cómo puedo rotar el emulador de Android desde el código de prueba?
  • Ejecutar todas las pruebas de unidad en Android Studio
  • Robolectric y Android Studio 1.1.0 y pruebas de biblioteca
  • Cómo configurar gradle-2.2.1-all.zip manualmente
  • Crear proyecto de prueba de android en intellij idea 13 community edition
  • Android Testing: ¿Puedo enviar sms al número de emulador del método de prueba?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.