2015-05-06 11 views
10

Esiste un buon metodo per testare il codice dei risultati e i dati in un test Android Espresso? Sto usando Espresso 2.0.Come posso testare setResult() in un test Android Espresso?

Supponiamo di avere un Activity chiamato BarActivity.class, che dopo l'esecuzione di alcune azioni, chiama setResult(int resultCode, Intent data) con il payload appropriato.

Mi piacerebbe scrivere un test case per verificare il resultCode e data. Tuttavia, poiché setResult() è un metodo final, non riesco a sovrascriverlo.

Alcune opzioni ho pensato sono stati:

  • definire un nuovo metodo come setActivityResult() e basta usare che quindi può essere intercettato, ecc ...
  • scrivere un test di sola TestActivity che chiamerà startActivityForResult() su BarActivity e verificare il risultato in TestActivity.onActivityResult()

Cercando di pensare a ciò che è minore dei due mali, o se ci sono altri suggerimenti su come verificare questa. Eventuali suggerimenti? Grazie!

+0

Ecco una soluzione particolare per l'opzione 2: https://product.reverb.com/2016/03/12/testing-android-activity-results/ Tuttavia, non completa, almeno non sono riuscito a fare funziona. – friedger

risposta

5

Se siete disposti a effettuare l'aggiornamento a 2.1, allora date un'occhiata a Espresso-Intents:

Utilizzando l'API con l'intenzione (cugino di Mockito.when), è possibile fornire una risposta per le attività che vengono lanciati con startSubActivity

questo significa che è possibile costruire e restituire alcun risultato quando viene lanciata una specifica attività (nel tuo caso il BarActivity classe).

controllare questo esempio qui: https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html#intent-stubbing

E anche my answer su un argomento in qualche modo simile (ma con l'attività selettore di contatto), in cui mostro come costruire un risultato e inviarlo di nuovo alla attività che chiama startSubActivity()

+2

Non vedo come testare il metodo setResult con Espresso-Intents. Potresti chiarire? – friedger

10

Se nel frattempo si è passati alla più recente Espresso, la versione 3.0.1, 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))); 

È possibile trovare un esempio operativo here.

+1

Questo è sicuramente il modo più pulito finché puoi andare su 3.0.1. – skeeve

+0

Se 'hasResultCode' e' hasResultData' non possono essere risolti. Aggiungi 'androidTestCompile 'com.android.support.test.espresso: espresso-contrib: 3.0.1'' in build.gradle – Paglian