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 Предоставление расширенного класса

Solutions Collecting From Web of "Android Unit Test: как очистить SharedPreferences"

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

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

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

С слегка измененной версией clearSharedPrefs от 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(); } 

Вы тестируете класс, чтобы расширить 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(); } } 

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