1
为了“虚拟化”我的应用程序在测试环境中运行的文件系统,我想要shadow Context.getFilesDir()
,但找不到正确的封闭类来映射。Robolectric 3中的shadowing 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()
未阴影。
ContextWrapper
被Robolectric的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); (RuntimeEnvironment.application.getApplicationContext())。然后返回(RuntimeEnvironment.application);当(RuntimeEnvironment.application.getFilesDir())。然后返回(filesDir);' –