我正在使用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);