Android InstrumentationTestCase getFilesDir()返回null

我正在使用InstrumentationTestCase对我的应用程序的一个组件进行单元测试.

该组件将数据持久保存到内部存储并使用Context :: fileList();检索持久化文件.

我遇到以下问题:在应用程序中使用此方法(在设备上)工作完全正常.但是当我尝试使用InstrumentationTestCase(Android-)单元测试(也在设备上)时,我在fileList()方法中得到一个NullPointerException.我深入研究android源代码,发现getFilesDir()(see source here)返回null并导致此错误.

要重现的代码如下:

public class MyTestCase extends InstrumentationTestCase
{   
    public void testExample() throws Exception
    {
        assertNotNull(getInstrumentation().getContext().getFilesDir()); // Fails
    }
}

我的问题是:这种行为是否有意?我该怎么做才能绕过这个问题?我是使用InstrumentationTestCase还是应该使用不同的东西?

我找到了this question,但我不确定这是否涵盖了我遇到的同样问题.

解决方法

我认为您将测试数据与测试应用程序分开是正确的.

您可以通过执行以下命令为Instrumentation app创建文件目录来解决Null问题

adb shell
cd /data/data/<package_id_of_instrumentation_app>
mkdir files

您只能在模拟器或root设备上执行此操作.

然后从你的问题测试不会失败.我做了它并且还将名为tst.txt的文件上传文件dir,所有以下测试都成功:

assertNotNull(getInstrumentation().getContext().getFilesDir());
assertNotNull(getInstrumentation().getContext().openFileInput("tst.txt"));
assertNotNull(getInstrumentation().getContext().openFileOutput("out.txt",Context.MODE_PRIVATE));

但我认为为测试项目提供数据的更方便的方法是使用测试项目的资产,您可以在其中简单地保存一些文件并打开它们:

assertNotNull(getInstrumentation().getContext().getAssets().open("asset.txt"));

或者如果要将某些测试结果保存到文件中,可以使用ExternalStorage:

File extStorage = Environment.getExternalStorageDirectory();
assertNotNull(extStorage);

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...