2013-07-22 15 views
15

Sto tentando di cancellare tutte le SharedPreferences aggiunte durante i miei test. Ho già letto alcuni post e la documentazione ufficiale (SharedPreferences.Editor.clear()). Ma quando avvio la mia applicazione dopo aver eseguito i test delle unità, ho ancora trovato i valori di test.Test unità Android: come cancellare SharedPreferences

Così, nel AndroidTestCase.tearDown(), faccio questo:

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

} 

Ogni altra domanda che ho trovato su così è stato sull'aggiunta commit() dopo la clear(), che ho già fatto qui.

EDIT 1 Aggiunta setUp() metodo

EDIT 2 Fornire classe estesa

+0

stai utilizzando lo stesso contesto per scrivere e deselezionare SharedPreferences? – Blackbelt

+0

il contesto è quello fornito dalla classe AndroidTestCase. Inoltre, quando lancio la mia applicazione, chiamo ancora 'getContext()'. Posso fornirti il ​​metodo 'setUp()' dei miei test di unità se lo desideri. – mithrop

+0

sì, probabilmente è meglio. Sei consapevole del fatto che quando esegui i test un diverso apk è aggiornato sul test del dispositivo? – Blackbelt

risposta

9

Si dovrebbe estendere ActivityInstrumentationTestCase2 e utilizzare getInstrumentation().getTargetContext() per ottenere il contesto per l'applicazione di destinazione di essere strumentata (in prova)

2

La classe di test dovrebbe estendere InstrumentationTestCase.

E si dovrebbe usare getInstrumentation().getTargetContext().

Se è necessario manipolare direttamente l'attività , la classe di test deve essere estesa a ActivityInstrumentationTestCase2.

Così il vostro banco di prova dovrebbe essere simile a questo:

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

Se si utilizza ActivityTestRule da Espresso, provate questo:

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

Con una versione leggermente modificata di stevo.mit di 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

Un'aggiunta: poiché il tuo metodo 'clearSharedPrefs() è indipendente dal classe di test, dovresti spostarla in classe helper e renderla pubblica e statica in modo da poterla riutilizzare. – tir38

+0

questa dovrebbe essere la risposta accettata poiché ActivityInstrumentationTestCase2 è già deprecato – Khriz

0

Eseguo il metodo con AndroidJUnit4 e funziona perfettamente quando è chiamato come @Before e @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())); 
    } 
}