2012-03-27 1 views
44

Я разрабатываю программное обеспечение, которое загружает информацию из 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()); 
    } 

ответ

65

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

Предположим, вы получили папку активов в обоих андроида проекта проекта и тест, и ставишь XML-файл в папке с ресурсами. в тестовом коде при тестовом проекте, это будет загружать XML из папки андроида проекта активов:

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

Это будет загружать XML из папки тест проекта активов:

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

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

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

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

Спасибо. Это сработало, только я сначала должен был изменить свой тестовый пример на InstrumentationTestCase. –

+0

Я изменил свой вопрос, чтобы показать код, который сработал. Спасибо за вашу помощь. –

+0

+1 для варианта 2.Просто добавлен каталог ресурсов на уровне res и новый код «только что сработал» в сборке Android Studio. Не нужно суетиться со способами построения. –

7

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

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

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

+0

Можете ли вы показать, как выглядит ваш тестовый класс при доступе к этим методам? – JPM