InstrumentationTestCase

InstrumentationTestCase

我正在使用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,但不确定是否涵盖了我遇到的相同问题。

最佳答案

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

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

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

您只能在仿真器或 Root设备上执行上述操作。

然后根据您的问题进行测试将不会失败。我做到了,并且还将名为tst.txt的文件上传到files dir,以下所有测试均成功:
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);

10-07 17:29