Cómo proporcionar archivos de datos para las pruebas de unidad de Android

Estoy desarrollando un software que carga información de archivos XML usando la implementación de java.xml.parsers.DocumentBuilder y DocumentBuilderFactory de Android. Estoy escribiendo pruebas de unidad de mis objetos y tengo que ser capaz de proporcionar una variedad de archivos xml que ejercerán el código bajo prueba. Estoy usando Eclipse y tengo un proyecto de prueba Android separado. No puedo encontrar una manera de poner el xml de la prueba en el proyecto de prueba tal que el código bajo prueba puede abrir los archivos.

  • Si pongo los archivos en / assets del proyecto de prueba, el código bajo prueba no puede verlo.
  • Si pongo los archivos en los / assets del código bajo prueba, puede ver los archivos, pero ahora estoy desordenando mi sistema actual con sólo los archivos de prueba de datos.
  • Si copio manualmente los archivos en el directorio / sdcard / data, puedo abrirlos desde el código bajo prueba, pero eso interfiere con la automatización de mis pruebas.

Cualquier sugerencia de cómo tener diferentes archivos de prueba xml residir en el paquete de prueba, pero ser visible para el código bajo prueba sería muy apreciada.

He aquí cómo intenté estructurar la prueba unitaria:

public class AppDescLoaderTest extends AndroidTestCase { private static final String SAMPLE_XML = "sample.xml"; private AppDescLoader m_appDescLoader; private Application m_app; protected void setUp() throws Exception { super.setUp(); m_app = new Application(); //call to system under test to load m_app using //a sample xml file m_appDescLoader = new AppDescLoader(m_app, SAMPLE_XML, getContext()); } public void testLoad_ShouldPopulateDocument() throws Exception { m_appDescLoader.load(); } } 

Esto no funcionó como el archivo SAMPLE_XML está en el contexto de la prueba, pero AndroidTestCase está proporcionando un contexto para el sistema bajo prueba, que no puede ver un activo del paquete de prueba.

Este es el código modificado que funcionó por respuesta dada:

 public class AppDescLoaderTest extends InstrumentationTestCase { ... protected void setUp() throws Exception { super.setUp(); m_app = new Application(); //call to system under test to load m_app using //a sample xml file m_appDescLoader = new AppDescLoader(m_app, SAMPLE_XML, getInstrumentation().getContext()); } 

Opción 1 : Utilizar InstrumentationTestCase

Supongamos que tiene la carpeta de activos en el proyecto de android y el proyecto de prueba y coloca el archivo XML en la carpeta de activos. En su código de prueba en proyecto de prueba, esto cargará xml de la carpeta de activos de proyecto de android:

 getInstrumentation().getTargetContext().getResources().getAssets().open(testFile); 

Esto cargará xml desde la carpeta de activos de proyecto de prueba:

 getInstrumentation().getContext().getResources().getAssets().open(testFile); 

Opción 2 : Utilizar ClassLoader

En el proyecto de prueba, si la carpeta de activos se agrega a la ruta de construcción del proyecto (que fue realizada automáticamente por el complemento de ADT antes de la versión r14), puede cargar el archivo de res o directorio de activos (es decir,

 String file = "assets/sample.xml"; InputStream in = this.getClass().getClassLoader().getResourceAsStream(file); 

Para las pruebas de unidad de Android y JVM, utilizo lo siguiente:

 public final class DataStub { private static final String BASE_PATH = resolveBasePath(); // eg "./mymodule/src/test/resources/"; private static String resolveBasePath() { final String path = "./mymodule/src/test/resources/"; if (Arrays.asList(new File("./").list()).contains("mymodule")) { return path; // version for call unit tests from Android Studio } return "../" + path; // version for call unit tests from terminal './gradlew test' } private DataStub() { //no instances } /** * Reads file content and returns string. * @throws IOException */ public static String readFile(@Nonnull final String path) throws IOException { final StringBuilder sb = new StringBuilder(); String strLine; try (final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"))) { while ((strLine = reader.readLine()) != null) { sb.append(strLine); } } catch (final IOException ignore) { //ignore } return sb.toString(); } } 

Todos los archivos sin formato que puse en la siguiente ruta: ".../project_root/mymodule/src/test/resources/"

  • Rotar Marcador y Mover Animación en Mapa como Uber Android
  • Necesita ayuda para cambiar de actividad
  • ¿Cómo poner el carácter del espacio en un nombre de la secuencia en XML?
  • Android - Creación de una imagen animada de tipo analógico para el movimiento
  • Solo se muestra un elemento en la vista de reciclado
  • Android: textColor no funciona
  • El efecto Ripple no va por encima de ImageView
  • SyncML con Android y servicio Web de PHP
  • Estilo de todas las vistas de texto (o vista personalizada) sin agregar el atributo de estilo a cada TextView
  • Uso del atributo XML "android: focusableInTouchMode"
  • Animación flotante suave con traducción en XML
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.