web-dev-qa-db-ja.com

Androidユニットテスト: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 1setUp()メソッドの追加

編集2拡張クラスの提供

22
mithrop

_ActivityInstrumentationTestCase2_ を拡張し、getInstrumentation().getTargetContext()を使用して、インストルメントされている(テスト中の)ターゲットアプリケーションのコンテキストを取得する必要があります。

12
Blackbelt

Espresso からActivityTestRuleを使用している場合は、次のことを試してください。

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

テストクラスは拡張する必要があります 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();
    }
}
2
stevo.mit

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