2012-02-03 9 views
6

Mam przypadek testowy, który wykorzystuje Instrumentation.ActivityMonitor w celu sprawdzenia, czy wysłano zamiar. Działa to dobrze, gdy test się powiedzie. Jeśli asercja nie powiedzie się, następny przypadek testowy zawiesza się w wywołaniu getActivity() w setUp().Aktywność Androida Niepowodzenie mechanizmu monitorowania Funkcja getActivity() nigdy nie zwraca

Czy mam zadzwonić do jakiejś metody czyszczenia?

Wygląda na to, że koncentruje się wokół uruchamiania działania, ale ActivityMonitor go nie łapie. Oznacza to, że filtr IntentFilter nie został uruchomiony. Test kończy się niepowodzeniem, ale nowe działanie nigdy nie jest zwalniane i wydaje się zakłócać następne wywołanie funkcji getActivity().

Ten problem jest similar to another question, ale to rozwiązanie (wywołanie super.tearDown()) nie naprawiło mojego problemu.

public class SimpleActivityTest 
    extends ActivityInstrumentationTestCase2<SimpleActivity> { 

    private SimpleActivity activity; 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     this.getInstrumentation().setInTouchMode(false); 

     Intent intent = new Intent(); 
     intent.putExtra("DATA_ITEM_1", 1); 
     intent.putExtra("DATA_ITEM_2", 2); 
     this.setActivityIntent(intent); 

     this.activity = getActivity(); // this call hangs on second test 
    } 

    public void testOtherActivityCalled() { 
     IntentFilter ifilter = new IntentFilter(Intent.ACTION_VIEW); 
     ifilter.addDataScheme("http"); 
     ifilter.addDataAuthority("some.domain.com", null); 
     ifilter.addDataPath("foobar", PatternMatcher.PATTERN_PREFIX); 

     ActivityMonitor activityMonitor = getInstrumentation().addMonitor(
       ifilter, null, false); 

     activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       // launch other activity somehow 
      } 
     }); 
     getInstrumentation().waitForIdleSync(); 

     Activity otherActivity = activityMonitor.waitForActivityWithTimeout(2000); 
     assertNotNull(otherActivity); 
     otherActivity.finish(); 
    } 

    public void testSomethingElse() { 
     // This code will never run because getActivity() in setUp() will 
     // never return 
    } 
} 
+0

Czy rozwiązałeś ten problem? Mam to samo i nie wiem jak to naprawić :( – dexxtr

Odpowiedz

1

I podejrzany że Runnable utworzeniu nigdy nie jest wyjściem. Ponieważ działa w wątku UI, nigdy nie pozwala na to, aby cykl życia Działania był zgodny z potrzebami. Czy jest jakiś szczególny powód, dla którego robisz to z wątku UI?

+0

Funkcja waitForIdleSync() zapewnia, że ​​wątek interfejsu użytkownika jest gotowy do pracy. Używam wątku interfejsu użytkownika do robienia takich rzeczy, jak wybieranie listy lub klikanie przycisków. Te kliknięcia przechodzą, więc wiem Runnable kończy się. – Cristian

0

Miałem podobne problemy, więc zacząłem używać biblioteki Robotium. Zamykam wszystkie działania w metodzie tearDown():

protected void setUp() throws Exception { 
     super.setUp(); 
     mSolo = new Solo(getInstrumentation(), getActivity()); 
    } 
protected void tearDown() { 
     mSolo.finishOpenedActivities(); 
     mSolo.finishInactiveActivities(); 
    } 
Powiązane problemy