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条评论
登录后参与评论

相关文章

来自分类Dev

共享首选项-Android

来自分类Dev

使用Mockito在Android单元测试中模拟共享首选项时出错

来自分类Dev

Android应用-共享首选项无法正确加载

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Android中字符串的共享首选项

来自分类Dev

Android Studio-无法读取首选项设置

来自分类Dev

在Android中共享首选项

来自分类Dev

如何保护Android共享首选项?

来自分类Dev

Xamarin Android模拟共享首选项

来自分类Dev

Android:共享首选项架构

来自分类Dev

Android 共享首选项崩溃

来自分类Dev

android共享首选项&捆绑vs共享首选项

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在Android中设置用户首选项

来自分类Dev

在共享首选项中存储数据和Android中的数据库之间的区别

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在Android的共享首选项中添加布尔数组

来自分类Dev

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

来自分类Dev

如何使用Android中的共享首选项更新列表recyclerview?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在Android的共享首选项中添加布尔数组

来自分类Dev

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

Related 相关文章

  1. 1

    共享首选项-Android

  2. 2

    使用Mockito在Android单元测试中模拟共享首选项时出错

  3. 3

    Android应用-共享首选项无法正确加载

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

    Android中字符串的共享首选项

  8. 8

    Android Studio-无法读取首选项设置

  9. 9

    在Android中共享首选项

  10. 10

    如何保护Android共享首选项?

  11. 11

    Xamarin Android模拟共享首选项

  12. 12

    Android:共享首选项架构

  13. 13

    Android 共享首选项崩溃

  14. 14

    android共享首选项&捆绑vs共享首选项

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

    在Android中设置用户首选项

  19. 19

    在共享首选项中存储数据和Android中的数据库之间的区别

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

    如何在Android的共享首选项中添加布尔数组

  24. 24

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

  25. 25

    如何使用Android中的共享首选项更新列表recyclerview?

  26. 26

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

  27. 27

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

  28. 28

    如何在Android的共享首选项中添加布尔数组

  29. 29

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

热门标签

归档