2014-11-25 9 views
5

Robolectric, umożliwia testowanie, że Activity zostało uruchomione przy użyciu shadowOf(activity).peekNextStartedActivity(). Jednak ta metoda nie działa, jeśli Activity jest uruchamiany z FLAG_ACTIVITY_CLEAR_TOP. Jest to intuicyjne, ponieważ celem tej flagi nie jest rozpoczęcie nowego Activity, ale przeniesienie istniejącego Activity w tylnym stosie do przodu. Czy jest jakiś sposób na przetestowanie tego scenariusza?Testowanie, że działanie zostało rozpoczęte za pomocą FLAG_ACTIVITY_CLEAR_TOP

UPDATE

Moje badania scenariusz jest następujący:

Istnieją 3 Działania związane, niech ich połączenia, B i C. Aktywność badanego jest B, który został rozpoczęty przez A. B teraz rozpoczyna C dla wyniku, a kiedy wynik jest otrzymywany, powraca do A, używając flagi FLAG_ACTIVITY_CLEAR_TOP. Mimo że w tym czasie nie ma żadnego działania A, oczekuję, że zostanie ono uruchomione i będzie dostępne przez peekNextStartedActivity().

Odpowiedz

2

gdy wyślesz intencji z działalności (na przykład), można użyć metody zestaw znaczników:

Intent i = new Intent(MyActivity.this, SomeActivity.class); 
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP | SOME_OTHER_FLAGS...); 
startActivity(i); 

na zaowocowało działalności (SomeActivity w przykładzie) można użyć metody getIntent:

getIntent().getFlags() 

tak prawdziwe pytanie brzmi: jak podzielić powrotem flagi do ich podstawowych komponentów (logiczną OR)

na podstawie tego artykułu: http://code.tutsplus.com/articles/understanding-bitwise-operators--active-11301

prostu sprawdzić flagi ze składnikiem trzeba

if ((getIntent().getFlags() & FLAG_ACTIVITY_CLEAR_TOP) != 0) 
{ 
    // do something here 
} 
+0

W moim przypadku byłbym szczęśliwy nawet przy sprawdzaniu, czy działanie zostało uruchomione poprzez sprawdzenie jego nazwy składnika, jednak funkcja peekNextStartedActivity() nie zwraca poprawnej aktywności, jeśli użyję FLAG_ACTIVITY_CLEAR_TOP, aby ją uruchomić. – Egor

0

próbowałam Test:

private void checkMainActivityIsStarted() 
{ 
    activity.showMainActivity(); 

    Intent intent = shadowOf(activity).getNextStartedActivity(); 
    assertThat(intent).hasComponent(Robolectric.application, MainActivity.class); 
    assertThat(intent.getFlags()).isEqualTo(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
} 

Dla następnego kodu:

public void showMainActivity() 
{ 
    Intent intent = new Intent(this, MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
} 

to działa dla Ciebie ?

UPDATE

Jak dla mnie powinien podzielić ten test na dwie części:

  1. aktywny C wraca prawidłowy kod Wynik
  2. Działanie B podczas rozmowy onActivityResult (jest to metoda publicznych) Aktywność pożarów A

Jeśli chodzi o mnie, nie ma sensu testować Androidów podając intencje betw een działania. Popraw mnie, jeśli rozumiem coś złego.

+0

W moim scenariuszu wystrzeliwuję ten rodzaj intencji w onActivityResult(), obsługując wyniki wysłane przez inne działanie (nazwijmy to A). W teście rozpoczynam działanie A, otrzymuję jego wynik i sprawdzam, czy uruchomił zamiar FLAG_ACTIVITY_CLEAR_TOP. Jednak peekNextStartedActivity() (i getNextStartedActivity() jak również) dał mi zamiar działania A. – Egor

+0

Chciałbym podzielić go na dwa testy –

+0

Tak, ale AFAIK to jedyny sposób na test OnActivityResult() – Egor

0

To zdecydowanie rozwiązuje twój problem.

Intent i = new Intent(MyActivity.this, SomeActivity.class); 
    i.setFlags(FLAG_ACTIVITY_CLEAR_TOP | SOME_OTHER_FLAGS...); 
    startActivity(i); 

ale jeśli można zakończyć bieżącą aktywność w czasie intencyjnego z B do C, a kiedy pokazuje wynik i aktywność Wykończenie C to def zabierze cię na ekranie.

Powiązane problemy