2015-11-18 11 views
5

Nella mia applicazione, quando l'utente fa clic su un pulsante "Registrati", viene avviato RegisterActivity. Una volta che l'utente compila il modulo, i dettagli vengono registrati su un servizio Web e se la registrazione riesce, RegisterActivity finisce con RESULT_OK. Questo è riassunto nel codice di esempio riportato di seguito:Espresso: Come posso verificare che l'attività sia terminata con risultato RESULT_OK

public void submitRegistration() { 

    showProgressDialog(R.string.registration, R.string.please_wait); 

    getWebApi().register(buildRegistrationFromUI(), new Callback<ApiResponse>() { 
     @Override 
     public void success(ApiResponse apiResponse, Response response) { 

      hideProgressDialog(); 

      setResult(RESULT_OK); 
      finish(); 
     } 

     @Override 
     public void failure(RetrofitError error) { 

      hideProgressDialog(); 
      showErrorDialog(ApiError.parse(error)); 
     } 
    }); 
} 

Utilizzando Espresso, Come posso verificare che l'attività finito con setResult(RESULT_OK).

Nota: Io faccio NON voglio creare un intento fittizio, voglio controllare lo stato del risultato intento.

metodo
+0

[Sembra che questo abbia già ricevuto risposta] (https://stackoverflow.com/questions/5569830/get-result-from-an-activity-after-finish-in-an-android-unit-test), usando la riflessione per ottenere i valori dall'attività. –

risposta

8

Tutto il setResult (...) non è quello di cambiare i valori dei campi nella classe di attività

public final void setResult(int resultCode, Intent data) { 
    synchronized (this) { 
     mResultCode = resultCode; 
     mResultData = data; 
    } 
} 

Così possiamo usare Java Reflection per accedere al campo mResultCode per verificare se il valore ha infatti stato impostato su RESULT_OK.

@Rule 
public ActivityTestRule<ContactsActivity> mActivityRule = new ActivityTestRule<>(
     ContactsActivity.class); 


@Test 
public void testResultOk() throws NoSuchFieldException, IllegalAccessException { 
    Field f = Activity.class.getDeclaredField("mResultCode"); //NoSuchFieldException 
    f.setAccessible(true); 
    int mResultCode = f.getInt(mActivityRule.getActivity()); 

    assertTrue("The result code is not ok. ", mResultCode == Activity.RESULT_OK); 
} 
0

Non so se ho capito correttamente la domanda. Tuttavia, alla chiusura dell'attività, se l'applicazione principale è ancora aperta, è possibile controllare il risultato dell'attività. È necessario esporre lo stato del risultato nel codice dell'applicazione e scrivere il controllo di visualizzazione per verificare se corrisponde a quello previsto.

2

si può semplicemente utilizzare un ActivityTestRule e ottenere il risultato di attività in questo modo:

assertThat(rule.getActivityResult(), hasResultCode(Activity.RESULT_OK)); 
assertThat(rule.getActivityResult(), hasResultData(IntentMatchers.hasExtraWithKey(PickActivity.EXTRA_PICKED_NUMBER))); 

esempio completo disponibile here.