Я хотел бы затенять 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()
? Если да, то как?
Спасибо, не знали об этом классе. Похоже, Robolectric создает каталог типа '/ tmp//files'. Мое намерение состоит в том, чтобы изменить этот каталог, чтобы он указывал на что-то вроде '/ tmp//data/data/com.myapp/files'. Я попытался заменить приложение частичным макетом, так что 'getFilesDir()' возвращает нужный путь, но ничего не изменилось ... –
Возможно, вам понадобится частичный макет метода getApplicationContext() 'и укажите его на частичный макет исходного контекста, чтобы заставить его указать, где вам нужно. Это может показаться немного громоздким, так как другим вариантом было бы использование некоторой инъекции зависимостей для повторного реализации контекстного метода. –
Это сработало! Я сделал 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); ' –