2012-02-03 3 views
6

Instrumentation.ActivityMonitorを使用してインテントが送信されたかどうかを確認するテストケースがあります。テストが成功すると、これはうまく動作します。アサーションに失敗した場合、次のテストケースはsetUp()のgetActivity()呼び出しでハングします。Android ActivityMonitorの失敗によりgetActivity()が返されない

私はきれいにするいくつかのメソッドを呼び出すことになっていますか?

アクティビティの起動を中心にしているように見えますが、ActivityMonitorはそれをキャッチしません。つまり、IntentFilterはトリガーされませんでした。テストは失敗しますが、新しいActivityは決して解消されず、次のgetActivity()呼び出しを妨害するようです。

この問題はsimilar to another questionですが、この解決方法(super.tearDown()を呼び出す)で問題が解決されませんでした。

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

この問題を解決しましたか?私は同じで、それを修正する方法がわからない:( – dexxtr

答えて

1

I のRunnableはあなたが決して出ません作成した容疑者。それはUIスレッド上で実行されているため、アクティビティのライフサイクルでは必要なことは実行できません。あなたがUIスレッドからそれをやっている特別な理由はありますか?

+0

waitForIdleSync()はUIスレッドが正常に動作することを保証します。UIスレッドを使ってリストの選択やボタンをクリックします。 Runnableが終了します。 – Cristian

0

私は同様の問題がありましたので、私はRobotiumライブラリを使い始めました。 tearDown()メソッドのすべてのアクティビティを閉じます。

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