2016-04-20 28 views
7

我有兩個應用程序通過意圖彼此交互。我想驗證假設應用程序A正確調用startActivity應用程序B沒有實際啓動應用程序B。我嘗試過intending和Espresso的各種組合,但仍然推出應用程序B,而不是僅僅將它剔除。這會導致其餘測試失敗,因爲UI被應用B阻止。有任何想法嗎?使用意式咖啡粉碎意圖時出錯

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class MyActivityUiIntentsTest 
{ 

    @Rule 
    public IntentsTestRule<MyActivity> activityRule = 
      new IntentsTestRule<>(MyActivity.class, true, false); 

    @Test 
    public void shouldStartOtherActivityWhenButtonClicked() 
    { 
     Intents.init(); 
     intending(toPackage("my.package")) 
      .respondWith(new ActivityResult(Activity.RESULT_OK, null)); 

     activityRule.launchActivity(new Intent()); 

     onView(withId(R.id.viewId)).perform(click()); 
     intended(hasComponent(hasShortClassName("the.other.class.name"))); 

     Intents.release(); 
    } 
} 

更新:代碼爲onClick

@OnClick(R.id.viewId) 
public void startOtherActivity() 
{ 
    Intent intent = new Intent(); 
    intent.setClassName("my.package", "the.other.class.name"); 
    startActivity(intent); 
    finish(); 
} 
+1

後,我們可以看到在onclick意圖創建代碼IntentsTestRule將調用初始化你嗎?你有沒有在意圖上記錄包名?即,您的意圖不符合正確的意圖 – Blundell

+0

添加了'onClick'示例代碼。 – brwngrldev

+0

你在運行什麼設備/ emu API版本? –

回答

3

移動你的intending...代碼如下launchActivity並刪除.init()因爲活動啓動

+0

這解決了這個問題,謝謝! – brwngrldev

2

一個可能的解決方案是有意向調度間接。

例如我們有IntentDispatcher,我們用custom instrumentation test runner的技巧替換了功能性UI測試中的測試實現。

IntentDispatcher真正的實現只是調用context.startActivity()而在測試中,我們打開顯示Intent的所有內容,因此我們就可以確認這是Intent,我們想用咖啡的匹配處理專項活動。

此外,我們寫了一堆規則來處理像打開相機應用程序和嘲笑結果或只是嘲笑常規startActivity()調用的事情。

+0

這也是一個好主意,感謝分享它。 – brwngrldev