Как я могу перенести тестовое устройство базы данных на устройство из моего приложения модульного тестирования - PullRequest
5 голосов
/ 25 сентября 2010

Я пишу тест Android JUnit и хочу скопировать / сбросить файл тестового набора (это файл базы данных SQLite.) Если бы я был в основном приложении, я бы знал, что я мог бы просто поместить этот файл в каталог assets используйте getResources().getAssets().open(sourceFile)

Однако этот API, по-видимому, недоступен из класса ActivityInstrumentationTestCase2.

Существует ли простой способ скопировать файл с тестового ПК или я должен просто сохранить свежую копию тестового устройства на устройстве и скопировать его во временный файл?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 07 октября 2010

Ресурсы в вашем тестовом приложении и вашем основном приложении доступны отдельно в тестовом наборе инструментов.Если вы хотите получить доступ к ресурсам, которые находятся в папке res / raw или assets самого тестового проекта, вы можете использовать

getInstrumentation().getContext().getResources()

Для доступа к ресурсам в тестируемом приложении («целевом» приложении),используйте

getInstrumentation().getTargetContext().getResources()

Обратите внимание, однако, что вы никогда не можете изменять файлы в папке ресурсов;

getResources().getAssets().open(sourceFile)

возвращает InputStream.Нет способа изменить файл.Это потому, что ресурсы хранятся в сжатом виде внутри APK и вообще не доступны для записи.

Если вы хотите изменить путь к файлам, которые использует тестируемое действие, вам следует использовать ActivityUnitTestCase и setActivityContext () с RenamingDelegatingContext .Это позволяет перенаправить доступ к файлам и базам данных в контексте в новый каталог, указав префикс каталога.Вы даже можете использовать более сложный конструктор , чтобы обернуть целевой контекст для большинства операций, но использовать контекст вашего тестового приложения для файловых операций, так что действие получит доступ к файлам, хранящимся в тестовом приложении, а не в основном приложении, нопо-прежнему использовать другие ресурсы в основном приложении.

3 голосов
/ 16 октября 2010

Что я сделал для этого (не очень элегантным способом), так это скопировал тестовое устройство на мое устройство (или эмулированное устройство). Я назвал его «cleantestdatabase.db». Затем в тестовом коде я копирую его в «testdatabase.db», чтобы я мог изменить его с помощью своих тестов, но вернуть его в известное состояние. Вот код:

copyFile("cleantestdatabase.db", "testdatabase.db");

private void copyFile(String source, String dest) throws IOException{
    String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath() + getActivity().getString(R.string.default_dir);
    File newDir = new File(rootPath);
    boolean result = newDir.mkdir();
    if(result == false){
        Log.e("Error", "result false");
    }

    InputStream in = new FileInputStream(rootPath + source);    
    File outFile = new File(rootPath + dest);
    if(outFile.exists()) {
        outFile.delete();
    }
    outFile.createNewFile();

    OutputStream out = new FileOutputStream(outFile);
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}
...