2015-07-13 48 views
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()?如果是这样,怎么样?

回答

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); (RuntimeEnvironment.application.getApplicationContext())。然后返回(RuntimeEnvironment.application);当(RuntimeEnvironment.application.getFilesDir())。然后返回(filesDir);' –