【问题标题】:Android Unit Test : how to clear SharedPreferencesAndroid 单元测试:如何清除 SharedPreferences
【发布时间】:2013-07-21 09:38:02
【问题描述】:

我正在尝试清除测试期间添加的所有 SharedPreferences。我已经阅读了一些帖子和官方文档 (SharedPreferences.Editor.clear())。但是当我在单元测试运行后启动我的应用程序时,我仍然找到了测试值。

所以,在AndroidTestCase.tearDown(),我做了这个:

public class PrivateStorageUtilsTest extends AndroidTestCase {

private static final String KEY_SP_PACKAGE = "PrivateStorageUtilsTest";

    protected void setUp() throws Exception {
        super.setUp();

        // Clear everything in the SharedPreferences
        SharedPreferences sharedPreferences = getContext()
            .getSharedPreferences(KEY_SP_PACKAGE, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.commit();
    }

    protected void tearDown() throws Exception {
        // Clear everything in the SharedPreferences
        SharedPreferences sharedPreferences = getContext().
            getSharedPreferences(KEY_SP_PACKAGE, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.commit();
    }

}

我在 SO 上发现的所有其他问题都是关于在 clear() 之后添加 commit(),我已经在这里完成了。

EDIT 1添加setUp()方法

EDIT 2提供扩展类

【问题讨论】:

  • 您是否使用相同的上下文来写入和清除 SharedPreferences?
  • Context是AndroidTestCase类提供的。另外,当我启动我的应用程序时,我仍然调用getContext()。如果你愿意,我可以为你提供我的单元测试的 setUp() 方法。
  • 是的,它可能更好。您是否知道,当您运行测试时,设备测试会更新不同的 apk?
  • 添加了 setUp() 方法。不,我不知道这个事实。所以,如果不是同一个 APK,仍然需要测试值真的很奇怪,不是吗?
  • 你在扩展什么类?

标签: android unit-testing sharedpreferences android-testing


【解决方案1】:

如果您使用的是来自EspressoActivityTestRule,请尝试以下操作:

@Rule
public ActivityTestRule<MainActivity> activityTestRule =
    new ActivityTestRule<MainActivity>(MainActivity.class) {
        @Override
        protected void beforeActivityLaunched() {
            clearSharedPrefs(InstrumentationRegistry.getTargetContext());
            super.beforeActivityLaunched();
        }
    };

使用 stevo.mit 的 clearSharedPrefs 的略微修改版本:

private static final String KEY_SP_PACKAGE = "PrivateStorageUtilsTest";

/**
* Clears everything in the SharedPreferences
*/
private void clearSharedPrefs(Context context) {
    SharedPreferences prefs = 
        context.getSharedPreferences(KEY_SP_PACKAGE, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    editor.clear();
    editor.commit();
}

【讨论】:

  • 补充一点:由于您的 `clearSharedPrefs() 方法独立于测试类,您应该将其移至辅助类并使其公开和静态,以便您可以重用它。
【解决方案2】:

您应该扩展ActivityInstrumentationTestCase2 并使用getInstrumentation().getTargetContext() 来获取正在检测(正在测试)的目标应用程序的上下文

【讨论】:

    【解决方案3】:

    我使用 AndroidJUnit4 运行您的方法,当它被称为 @Before 和 @After 时,它可以完美运行。

    @RunWith(AndroidJUnit4.class)
    @LargeTest
    public class MyBusStopsTest {
        @Rule
        public ActivityTestRule<MyBusStopsActivity> mActivityRule = new ActivityTestRule<>(
                MyBusStopsActivity.class);
    
        @Before
        @After
        public void cleanSheredPrefs(){
            SharedPreferences sharedPreferences =
                    getInstrumentation().getTargetContext().getSharedPreferences(MyBusStopsActivity.FAV_LIST, Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.clear();
            editor.commit();
        }
    
        @Test
        public void showChooseBusStopActivityOnFABClick() {
            onView(withId(R.id.fab)).perform(click());
            onView(withChild(withId(R.id.choose_bus_button))).check(matches(isDisplayed()));
        }
     }
    

    【讨论】:

    • 对我来说,这只适用于使用@BeforeClass,而不是@Before
    【解决方案4】:

    你的测试类应该扩展InstrumentationTestCase

    你应该使用getInstrumentation().getTargetContext()

    如果您需要直接操作 activity,那么您的测试类应该扩展 ActivityInstrumentationTestCase2

    所以你的测试用例应该是这样的:

    public class PrivateStorageUtilsTest extends InstrumentationTestCase {
    
    private static final String KEY_SP_PACKAGE = "PrivateStorageUtilsTest";
    
        protected void setUp() throws Exception {
            super.setUp();
            clearSharedPrefs();
        }
    
        protected void tearDown() throws Exception {
            super.tearDown();
            clearSharedPrefs();
        }
    
        /**
         * Clears everything in the SharedPreferences
         */
        private void clearSharedPrefs() {
            SharedPreferences sharedPreferences = getInstrumentation().getTargetContext().
                 getSharedPreferences(KEY_SP_PACKAGE, Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.clear();
            editor.commit();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 2014-12-10
      • 2014-06-22
      • 2016-12-15
      • 2016-07-01
      • 2019-11-26
      • 2023-03-08
      相关资源
      最近更新 更多