我正在编写一个测试用例来验证一个写入Shared Preferences的类。我正在使用Android Studio v1.5。
在旧版的Eclipse中,当使用AndroidTestCase
时,会部署第二个apk文件到设备上,并且可以使用instrumentation context运行测试,因此可以在不修改主apk现有shared preferences文件的情况下使用instrumentation apk的shared preferences运行测试。
我花了整个早上的时间来尝试找出如何在Android Studio测试中获得非空上下文。显然,为Eclipse制作的单元测试与Android Studio测试框架不兼容,因为调用getContext()
会返回null。我认为在这个问题中找到了答案:Get context of test project in Android junit test case
随着Android Studio旧版本没有完整的测试支持,事情已经发生了变化,所以很多答案都是hack方法。显然,现在你应该像这样编写测试,而不是扩展InstrumentationTestCase
或AndroidTestCase
:
@RunWith(AndroidJUnit4.class)
public class MyTest {
@Test
public void testFoo(){
Context instrumentationContext = InstrumentationRegistry.getContext();
Context mainProjectContext = InstrumentationRegistry.getTargetContext();
}
}
所以现在我有一个非空的Instrumentation上下文,并且getSharedPreferences
方法返回一个看起来能够工作的实例,但实际上没有写入任何首选项文件。
如果我执行以下操作:
context = InstrumentationRegistry.getContext();
然后SharedPreferences编辑器会正确写入并提交,不会抛出任何异常。仔细检查后,我发现该编辑器正在尝试写入此文件:
data/data/<package>.test/shared_prefs/PREFS_FILE_NAME.xml
但是该文件从未被创建或写入。
然而,使用以下内容:
context = InstrumentationRegistry.getTargetContext();
编辑器工作正常,偏好设置已写入此文件:
/data/data/<package>/shared_prefs/PREFS_FILE_NAME.xml
偏好设置以私密模式实例化:SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
据我所知,在运行测试后,没有将测试 apk 上传到设备上。这可能解释了为什么文件未使用检测上下文进行编写。是否有可能这个上下文是一个静默失败的虚假上下文?如果是这种情况,我应该如何获取一个真正的检测上下文以便在不改变主项目首选项的情况下编写首选项?
InstrumentationTestCase
或AndroidTestCase
的旧测试。 - Code-ApprenticeconnectedCheck
来运行它们的? - David MedenjakFile
并调用了exists()
方法,它返回了 false。另一方面,使用主项目上下文会产生一个实际的文件,我甚至可以使用 FileReader 记录它的内容。 - Mister Smith