Je développe des logiciels qui chargent des informations à partir de fichiers XML en utilisant l’implémentation d’Android de java.xml.parsers.DocumentBuilder et DocumentBuilderFactory. J’écris des tests unitaires de mes objects et je dois être en mesure de fournir une variété de fichiers XML qui exerceront le code sous test. J’utilise Eclipse et j’ai un projet de test Android séparé. Je ne peux pas trouver un moyen de placer le fichier XML de test dans le projet de test de sorte que le code sous test puisse ouvrir les fichiers.
Toute suggestion sur la façon d’avoir différents fichiers de test xml dans le package de test, mais être visible pour le code sous test, serait très appréciée.
Voici comment j’ai essayé de structurer le test unitaire:
public class AppDescLoaderTest extends AndroidTestCase { private static final Ssortingng 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()); }
Option 1 : Utiliser InstrumentationTestCase
Supposons que vous ayez un dossier d’actifs dans le projet android et dans le projet de test, et que vous placez le fichier XML dans le dossier des ressources. dans votre code de test dans le cadre d’un projet de test, cela va charger le fichier XML à partir du dossier des ressources du projet Android:
getInstrumentation().getTargetContext().getResources().getAssets().open(testFile);
Cela va charger XML à partir du dossier de ressources du projet de test:
getInstrumentation().getContext().getResources().getAssets().open(testFile);
Option 2 : utiliser ClassLoader
Dans votre projet de test, si le dossier assets est ajouté au chemin de construction du projet (qui a été effectué automatiquement par le plug-in ADT avant la version r14), vous pouvez charger le fichier à partir du répertoire res ou assets (c.-à-d.
Ssortingng file = "assets/sample.xml"; InputStream in = this.getClass().getClassLoader().getResourceAsStream(file);
Pour les tests d’unité Android et JVM, j’utilise les éléments suivants:
public final class DataStub { private static final Ssortingng BASE_PATH = resolveBasePath(); // eg "./mymodule/src/test/resources/"; private static Ssortingng resolveBasePath() { final Ssortingng 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 ssortingng. * @throws IOException */ public static Ssortingng readFile(@Nonnull final Ssortingng path) throws IOException { final SsortingngBuilder sb = new SsortingngBuilder(); Ssortingng 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.toSsortingng(); } }
Tous les fichiers bruts que j’ai mis dans le chemin suivant: ".../project_root/mymodule/src/test/resources/"