在Robolectric 3中影子化getFilesDir()

4
我想要追踪Context.getFilesDir()以便在测试环境中“虚拟”我的应用程序运行的文件系统,但我找不到合适的包含类进行追踪。
我尝试追踪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(),而这个方法并没有被覆盖。

ShadowContextWrapperContextWrapper进行了覆盖。但即使我覆盖了ContextWrapper,修改了我的类头部信息为

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

我的方法也没有被调用。

ShadowContextShadowContextWrapper的超类,是Context的影子,但我找不到被调用的getFilesDir()的具体实现。

所以我的问题是:是否可以影响getFilesDir()?如果可以,如何影响?

1个回答

4

我不太确定你想做什么,但是我曾经使用以下方法来获取Robolectric测试中的数据目录:

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

通过这个方法,我能够为测试创建任何需要的虚拟文件。希望对您有所帮助。


谢谢,我之前不知道有这个类。看起来Robolectric会创建一个目录,例如/tmp/<random string>/files。我的意图是将该目录更改为指向/tmp/<random string>/data/data/com.myapp/files这样的路径。我尝试使用部分模拟替换应用程序,以便getFilesDir()返回所需的路径,但似乎没有任何变化... - ris8_allo_zen0
你可能需要对 getApplicationContext() 方法进行部分模拟,并将其指向原始上下文的部分模拟,以便将其指向所需位置。虽然这听起来有点麻烦,但另一种选择是使用一些依赖注入来重新实现上下文方法。 - J.C. Chaparro
成功了!我已经让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);when(RuntimeEnvironment.application.getFilesDir()).thenReturn(filesDir); - ris8_allo_zen0
1
RuntimeEnvironment.application.getApplicationContext().getFilesDir(); 这会返回实际的Android文件系统吗?我只是将 RuntimeEnvironment.application. 传递给使用上下文来操作文件的类的实例。 - filthy_wizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接