2013-07-22 54 views
15

我想清除在我的測試過程中添加的所有SharedPreferences。我已經閱讀了一些帖子和官方文檔(SharedPreferences.Editor.clear())。但是當我在單元測試運行後開始我的應用程序時,我仍然發現測試值。Android單元測試:如何清除SharedPreferences

所以,在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()方法

編輯2提供了擴展的類

+0

您是否使用相同的上下文來選擇並清除SharedPreferences? – Blackbelt

+0

Context是由AndroidTestCase類提供的。另外,當我啓動我的應用程序時,我仍然調用'getContext()'。如果你願意,我可以爲你提供單元測試的'setUp()'方法。 – mithrop

+0

是的,可能是更好。您是否知道,當您運行測試時,不同的apk會在設備測試中更新? – Blackbelt

回答

2

你的測試課應該延伸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(); 
    } 
} 
10

如果您正在使用ActivityTestRuleEspresso,試試這個:

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

一個補充:因爲你的'clearSharedPrefs()方法獨立於測試類,你應該將它移動到助手類並公開和靜態,以便可以重用它。 – tir38

+0

這應該是被接受的答案,因爲ActivityInstrumentationTestCase2已被棄用 – Khriz

0

我運行你的方法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())); 
    } 
}