2015-05-06 5 views
10

Czy jest jakiś dobry sposób na przetestowanie kodu wynikowego i danych w teście Android Espresso? Używam Espresso 2.0.Jak mogę przetestować setResult() w teście Android Espresso?

Załóżmy, że mam Activity o nazwie BarActivity.class, który po wykonaniu niektórych czynności wywołuje setResult(int resultCode, Intent data) z odpowiednim ładunkiem.

Chciałbym napisać test case, aby zweryfikować resultCode i data. Jednak ponieważ setResult() jest metodą final, nie mogę jej przesłonić.

Niektóre opcje myślałem o to:

  • Zdefiniuj nową metodę jak setActivityResult() i po prostu używać, dzięki czemu może zostać przechwycone, etc ...
  • napisać test-tylko działanie testowe, które nazywamy startActivityForResult() na BarActivity i sprawdzić wynik w TestActivity.onActivityResult()

staramy się myśleć, co jest mniejszą z dwóch zła, czy istnieje jakieś inne sugestie, w jaki sposób przetestować w tym celu. Jakieś sugestie? Dzięki!

+0

Oto częściowe rozwiązanie dla opcji 2: https://product.reverb.com/2016/03/12/testing-android-activity-results/ Jednak nie do końca, przynajmniej nie udało mi się dokonać działa. – friedger

Odpowiedz

5

Jeśli są chętni, aby uaktualnić do 2,1, a następnie przyjrzeć Espresso-Intents:

Używanie zamierzają API (kuzyn Mockito.when), można udzielić odpowiedzi na działania, które są uruchamiane z startActivityForResult

to w zasadzie oznacza, że ​​jest możliwe zbudowanie i powrócić żadnego rezultatu, gdy specyficzna aktywność jest uruchomiony (w przypadku BarActivity klasy).

Sprawdź ten przykład tutaj: https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html#intent-stubbing

A także my answer na nieco podobnego problemu (ale z działalnością wyboru kontaktów), w którym pokażę jak zbudować wynik i wysłać go z powrotem do aktywności, która nazwie startActivityForResult()

+2

Nie widzę sposobu testowania metody setResult przy pomocy intencji espresso. Czy mógłbyś wyjaśnić? – friedger

10

Jeśli zaś jesteś włączony do najnowszej wersji 3.0.1 espresso, można po prostu użyć ActivityTestRule i uzyskać wynik z działalności takiego:

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

Możesz znaleźć działający przykład: here.

+1

To zdecydowanie najczystszy sposób, o ile można przejść do wersji 3.0.1. – skeeve

+0

Jeśli 'hasResultCode' i' hasResultData' nie może zostać rozwiązany. Dodaj 'androidTestCompile 'com.android.support.test.espresso: espresso-contrib: 3.0.1'' in build.gradle – Paglian

Powiązane problemy