Android Studio:无法在测试中写入共享首选项

史密斯先生

我正在尝试编写一个测试用例,以验证写入共享首选项的类。我正在使用Android Studio v1.5。

在较旧的月食中,使用时AndroidTestCase,会将第二个apk文件部署到设备,并且可以使用检测上下文运行测试,因此您可以使用检测apk的共享首选项运行测试,而无需更改主apk的现有共享首选项文件。

我整个上午都在尝试找出如何在Android Studio测试中获取非null上下文。显然,针对Eclipse进行的单元测试与Android Studio测试框架不兼容,因为调用会getContext()返回null。我以为我已经找到了这个问题的答案:在Android junit测试用例中获取测试项目的上下文

随着时间的推移,事情发生了变化,因为旧版本的Android Studio没有完整的测试支持。因此,很多答案只是黑客。显然现在而不是扩展,InstrumentationTestCase或者AndroidTestCase应该这样编写测试:

@RunWith(AndroidJUnit4.class)
public class MyTest {

    @Test
    public void testFoo(){
        Context instrumentationContext = InstrumentationRegistry.getContext();
        Context mainProjectContext = InstrumentationRegistry.getTargetContext();            
    }   
}

因此,我现在有了一个非null的检测上下文,该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上传到设备。这可以解释为什么未使用检测上下文写入文件。此上下文是否有可能是无声地失败的伪造上下文?

如果是这种情况,我如何获得REAL工具上下文,以便我可以编写首选项而不更改主项目的首选项

史密斯先生

事实证明,您无法使用检测上下文来写入共享首选项,即使在Eclipse中也是如此。这将是蚀的等效测试:

import android.content.Context;
import android.content.SharedPreferences;
import android.test.InstrumentationTestCase;

public class SharedPrefsTest extends InstrumentationTestCase {

    public void test() throws Exception { 
        Context context = getInstrumentation().getContext();
        String fileName = "FILE_NAME";

        SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("key", "value");
        editor.commit();

        SharedPreferences sharedPreferences2 = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
        assertEquals("value", sharedPreferences2.getString("key", null));
    }
}

我只是运行它,它也失败了。首选项从未写入。我认为在这种情况下禁止内部存储文件访问,因为调用Context.getFilesDir()会引发InvocationTargetException,并且调用File.exists()首选项文件也是如此(您可以检查编辑器正在使用调试器写入哪个文件,只需要在mFile内部调用一个私有变量即可。this.$0成员实例)。

所以我认为这实际上是错误的。尽管我过去曾使用工具上下文进行数据访问层测试,但实际上我们使用了主上下文(AndroidTestCase.getContext()),尽管我们为首选项和SQLite文件使用了不同的名称。这就是为什么单元测试没有修改常规应用程序文件的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android中首选项和共享首选项之间的区别

Android MVP-共享首选项

如何在Android中卸载应用程序时删除共享首选项

如何在Android中从App删除共享的首选项数据

如何保护Android共享首选项?

Android测试共享首选项

共享首选项无法存储和读取带条件的值。(Android Studio)

Android Studio无法识别xml中的androidx首选项库

如何在Kotlin的Android共享首选项中存储2D数组?

Android Studio:初始化共享首选项会导致活动启动崩溃

如何在Android Studio中保存具有共享首选项的listView [已解决]

将自定义数组添加到android中的共享首选项

如果共享首选项中包含值,则使图像按钮可见(Android)

Xamarin Android模拟共享首选项

我想使用共享的首选项在android中实现一次注册屏幕,但我无法获取以前的共享的首选项

Android中字符串的共享首选项

Android:共享首选项架构

Android在customListview中获取第一行的值(共享首选项)

无法访问服务内的共享首选项-Android

使用Android Studio中的共享首选项存储Google登录详细信息

如何从Android中的活动类将共享的首选项检索到非活动类中?

Android 共享首选项崩溃

Xamarin Forms 中的应用程序设置/属性类似于 Android 中的共享首选项

是否可以在 Xamarin 中检索存储在 Java 中的 Android 共享首选项

要保持登录状态,请在 android studio 中使用共享首选项

如何在 Android Studio 中使用共享首选项保存我的 listView

如何从 Android NDK C++ 代码中读取共享首选项?

使用共享首选项以编程方式在 android studio 中关闭 LinearLayout

android studio 中的共享首选项不起作用