Je développe un logiciel qui charge des informations à partir de fichiers XML en utilisant l'implémentation Android de Java.xml.parsers.DocumentBuilder et DocumentBuilderFactory. J'écris des tests unitaires de mes objets et je dois être en mesure de fournir une variété de fichiers xml qui exerceront le code testé. J'utilise Eclipse et j'ai un projet de test Android Android. Je ne trouve pas un moyen de mettre le xml de test dans le projet de test de telle sorte que le code sous test puisse ouvrir les fichiers.
Toute suggestion sur la façon d'avoir différents fichiers de test xml réside dans le package de test mais être visible par le code sous test serait grandement appréciée.
Voici comment j'ai essayé de structurer le test unitaire:
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();
}
}
Cela n'a pas fonctionné car le fichier SAMPLE_XML se trouve dans le contexte du test, mais AndroidTestCase fournit un contexte pour le système testé, qui ne peut pas voir un actif du package de test.
C'est le code modifié qui a fonctionné par réponse donnée:
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());
}
Pour Android et les tests unitaires JVM, j'utilise ce qui suit:
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();
}
}
Tous les fichiers bruts que j'ai mis dans le chemin suivant: ".../project_root/mymodule/src/test/resources/"