2015-07-13 2 views
1

Я хотел бы затенять Context.getFilesDir(), чтобы «виртуализировать» файловую систему, приложение которой работает в тестовой среде, но я не могу найти подходящий закрытый класс для тени.Shadowing getFilesDir() в Robolectric 3

Я попытался затенения Context:

@Implements(Context.class) 
public class MyShadow extends ShadowContext { 
    private File testRoot; 

    public MyShadow() { 
     testRoot = new File(FileUtils.getTempDirectory(), "androidTestRoot-" + System.currentTimeMillis()); 
    } 

    @Implementation 
    public File getFilesDir() { 
     return new File(testRoot, "data/data/com.myapp/files"); 
    } 
} 

но метод никогда не вызывается, потому что, видимо, мое приложение вызывает ContextWrapper.getFilesDir(), не затененное.

ContextWrapper скрыт от Robolectric's ShadowContextWrapper. Но даже если я тень ContextWrapper меняю заголовок класса, как

@Implements(ContextWrapper.class) 
public class MyShadow extends ShadowContextWrapper 

мой метод не вызывается слишком.

ShadowContext, суперкласс ShadowContextWrapper, является тенью Context, но я не могу найти конкретную реализацию getFilesDir(), что называется.

Так что мой вопрос: возможно ли затенять getFilesDir()? Если да, то как?

ответ

2

Я не совсем уверен, что вы пытаетесь сделать, но я использовал следующее, чтобы получить каталог данных на Robolectric тестов:

RuntimeEnvironment.application.getApplicationContext().getFilesDir(); 

Из того, что я был в состоянии создать манекен файлы для любой цели, которые мне нужны в тесте. Надеюсь, поможет.

+0

Спасибо, не знали об этом классе. Похоже, Robolectric создает каталог типа '/ tmp//files'. Мое намерение состоит в том, чтобы изменить этот каталог, чтобы он указывал на что-то вроде '/ tmp//data/data/com.myapp/files'. Я попытался заменить приложение частичным макетом, так что 'getFilesDir()' возвращает нужный путь, но ничего не изменилось ... –

+0

Возможно, вам понадобится частичный макет метода getApplicationContext() 'и укажите его на частичный макет исходного контекста, чтобы заставить его указать, где вам нужно. Это может показаться немного громоздким, так как другим вариантом было бы использование некоторой инъекции зависимостей для повторного реализации контекстного метода. –

+0

Это сработало! Я сделал RuntimeEnvironment.application.getApplicationContext() для самой RuntimeEnvironment.appilcation: 'File filesDir = new File (testRoot," data/data/"+ RuntimeEnvironment.application.getPackageName() +"/files "); RuntimeEnvironment.application = spy (RuntimeEnvironment.application); when (RuntimeEnvironment.application.getApplicationContext()). ThenReturn (RuntimeEnvironment.application), когда (RuntimeEnvironment.application.getFilesDir()). ThenReturn (filesDir); ' –

Смежные вопросы