Android InstrumentationTestCase getFilesDir()返回null

时间:2013-01-14 11:42:09

标签: android unit-testing

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

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

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

要重现的代码如下:

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

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

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

2 个答案:

答案 0 :(得分:10)

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

您可以通过执行以下命令为Null应用创建files目录来修复Instrumentation的问题

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

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

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

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

但我认为为测试项目提供数据的更方便的方法是使用测试项目的assets,您只需保存一些文件并打开它们:

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

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

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

答案 1 :(得分:1)

@Blackbelt mentioned in his comment使用getTargetContext()代替getContext()。我错过了评论,几个小时后,试图找出how to Realm.init() from an Android instrumented tests,我发现我需要getTargetContext()中的上下文...(沿途,我试图{{1 }})

context.filesDir.mkdirs()