Ответ 1
Вы должны расширить ActivityInstrumentationTestCase2
и использовать getInstrumentation().getTargetContext()
, чтобы получить контекст для целевого приложения, используемого (в тесте)
Я пытаюсь очистить все 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 Предоставление расширенного класса
Вы должны расширить ActivityInstrumentationTestCase2
и использовать getInstrumentation().getTargetContext()
, чтобы получить контекст для целевого приложения, используемого (в тесте)
Если вы используете 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();
}
Тестируемый класс должен расширять 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()));
}
}