Android Unit Test: как очистить SharedPreferences

Я пытаюсь очистить все 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, заключались в добавлении commit() после clear(), который я уже сделал здесь.

EDIT 1 Добавление метода setUp()

EDIT 2 Предоставление расширенного класса

Ответы

Ответ 1

Вы должны расширить ActivityInstrumentationTestCase2 и использовать getInstrumentation().getTargetContext(), чтобы получить контекст для целевого приложения, используемого (в тесте)

Ответ 2

Если вы используете ActivityTestRule из Espresso, попробуйте следующее:

@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();
}

Ответ 3

Тестируемый класс должен расширять InstrumentationTestCase.

И вы должны использовать getInstrumentation().getTargetContext().

Если вам нужно напрямую манипулировать активностью, тогда ваш тестовый класс должен расширить 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();
    }
}

Ответ 4

Я запускаю ваш метод с помощью 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()));
    }
 }