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