Как предоставить файлы данных для тестов на андроид

Я разрабатываю программное обеспечение, которое загружает информацию из файлов XML, используя реализацию Android java.xml.parsers.DocumentBuilder и DocumentBuilderFactory. Я пишу модульные тесты своих объектов, и мне нужно иметь возможность предоставить множество xml-файлов, которые будут выполнять тестируемый код. Я использую Eclipse и имею отдельный Android Test Project. Я не могу найти способ поместить тестовый xml в тестовый проект, чтобы тестируемый код мог открыть файлы.

  • Если я помещаю файлы в / активы тестового проекта, тестируемый код не может его увидеть.
  • Если я поместил файлы в / активы тестируемого кода, он, конечно, может видеть файлы, но теперь я забиваю свою фактическую систему только тестовыми файлами данных.
  • Если я копирую файлы в каталог / sdcard / data, я могу открыть их из тестируемого кода, но это мешает автоматизации моих тестов.

Любые предложения о том, как иметь разные тестовые файлы xml, находятся в тестовом пакете, но будут видимы для кода, который будет тестироваться.

Вот как я попытался структурировать модульный тест:

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(); } } 

Это не сработало, поскольку файл SAMPLE_XML находится в контексте теста, но AndroidTestCase предоставляет контекст для тестируемой системы, которая не может видеть актив из тестового пакета.

Это модифицированный код, который работал на каждый ответ:

 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()); } 

Solutions Collecting From Web of "Как предоставить файлы данных для тестов на андроид"

Вариант 1 : Используйте InstrumentationTestCase

Предположим, у вас есть папка с ресурсами в проекте android project и тестовом проекте, и вы поместите файл XML в папку с ресурсами. В тестовом коде в тестовом проекте это загрузит xml из папки ресурсов проекта Android:

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

Это загрузит xml из папки активов тестового проекта:

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

Вариант 2 : используйте ClassLoader

В тестовом проекте, если папка с ресурсами добавлена ​​в путь сборки проекта (который был автоматически выполнен плагином ADT до версии r14), вы можете загрузить файл из каталога res или assets (т.е. каталогов в пути создания проекта) без Context:

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

Для тестирования модулей Android и JVM я использую следующее:

 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(); } } 

Все исходные файлы, которые я ввел в следующий путь: ".../project_root/mymodule/src/test/resources/"