móviles - manual de programacion android pdf
Cómo proporcionar archivos de datos para pruebas de unidad de Android (2)
Para las pruebas de unidades de Android y JVM, uso lo siguiente:
public final class DataStub {
private static final String BASE_PATH = resolveBasePath(); // e.g. "./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 procesar que pongo en la siguiente ruta: ".../project_root/mymodule/src/test/resources/"
Estoy desarrollando un software que carga información de archivos XML utilizando la implementación de Android de java.xml.parsers.DocumentBuilder y DocumentBuilderFactory. Estoy escribiendo pruebas unitarias de mis objetos y necesito poder proporcionar una variedad de archivos xml que ejercerán el código bajo prueba. Estoy usando Eclipse y tengo un Android Test Project por separado. No puedo encontrar una manera de poner el xml de la prueba en el proyecto de prueba de modo que el código bajo prueba pueda 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 / assets del código bajo prueba, puede, por supuesto, ver los archivos, pero ahora estoy abarrotando mi sistema actual con solo archivos de datos de prueba.
- Si entrego los archivos al 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 residen en el paquete de prueba pero serán visibles para el código bajo prueba sería muy apreciada.
Aquí es cómo traté de 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ó ya que el archivo SAMPLE_XML está en el contexto de la prueba, pero AndroidTestCase proporciona 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 dado:
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 : Usar InstrumentationTestCase
Supongamos que tiene una carpeta de activos tanto en el proyecto android como en el proyecto de prueba, y coloca el archivo XML en la carpeta de activos. en su código de prueba bajo proyecto de prueba, esto cargará xml desde la carpeta de activos del proyecto de Android:
getInstrumentation().getTargetContext().getResources().getAssets().open(testFile);
Esto cargará xml desde la carpeta de activos del proyecto de prueba:
getInstrumentation().getContext().getResources().getAssets().open(testFile);
Opción 2 : usar ClassLoader
En su proyecto de prueba, si la carpeta de activos se agrega a la ruta de compilación del proyecto (que se completó automáticamente con ADT antes de la versión r14), puede cargar archivos desde el directorio res o assets (es decir, directorios bajo la ruta de compilación del proyecto) sin Contexto:
String file = "assets/sample.xml";
InputStream in = this.getClass().getClassLoader().getResourceAsStream(file);