gpt4 book ai didi

android - 模拟 SharedPreferences.Editor.putString()

转载 作者:行者123 更新时间:2023-11-29 00:58:31 27 4
gpt4 key购买 nike

我最近开始使用 Android Studio 3.1.2 和 SDK 19 编写我真正的第一个 android 项目。

我目前正在为我的组件编写单元测试,并使用 Mockito 模拟依赖于 Android API 的对象。当我为我的 SessionHandler 编写测试时,它是一个管理存储在 SharedPreferences 中的数据的辅助类,我遇到了这个问题,如果我想检查,如果 e. G。 mockEdit.remove("my_key") 成功了,我不知道如何模拟这个行为。

这就是我准备模拟的东西的方式:

private final Context mockedContext = Mockito.mock(Context.class);
private final SharedPreferences mockedPrefs = Mockito.mock(SharedPreferences.class);
private final SharedPreferences.Editor mockEdit = Mockito.mock(SharedPreferences.Editor.class);
private boolean shouldReturnTestUUID = true;

@Before
public void prepareMocks() {
Mockito.when(mockedContext.getSharedPreferences(anyString(), anyInt()).thenReturn(mockedPrefs);
Mockito.when(mockedPrefs.getString("my_key", null)).thenReturn(shouldReturnTestUUID ? "test_UUID" : null);
//this is the one, I got stuck at
Mockito.when(mockEdit.remove("my_key")).thenReturn(mockEdit.putString("my_key", null));
}

我实际测试的方法:

public synchronized static void removeAppInstanceID(Context context) {
if (appInstanceID != null) {
SharedPreferences sharedPrefs = context.getSharedPreferences("session", Context.MODE_PRIVATE);
sharedPrefs.edit().remove("my_key").apply();
}
}

测试方法:

@Test
public void canRemoveUUID() {
shouldReturnTestUUID = false;
SessionHandler.removeAppInstanceID(mockedContext);
assertNull(mockedPreferences.getString("my_key", null));
shouldReturnTestUUID = true;
}

如果我尝试运行这个测试,我会得到一个 UnfinishedStubbingException,它指向我想要模拟 mockEdit.remove("my_key") 的行。看起来, stub 不知道如何处理 mockEdit.putString("my_key", null);

所以我的问题是,如何模拟此方法,以便调用 mockedPrefs.getString("my_key") 并检查返回值是否为 null?感谢转发。

最佳答案

你有两个选择:

  • 使用 Robolectric 模拟 SharedPreferences像这儿: https://stackoverflow.com/a/9755286/1150795 . Robolectric 是一种常见的用于对 Android 应用程序和 Mocking 对象进行单元测试的工具安卓开发工具包
  • 您可以添加额外的抽象层并隐藏将 SharedPreferences 保存在接口(interface)后面,可以用 Mockito 模拟

关于android - 模拟 SharedPreferences.Editor.putString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52815372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com