2013-05-26 30 views
0

我通過運行一個測試實現運行我的Android測試,該測試實現從庫項目「派生」(因爲我有一個包含baselib和「具體應用項目」的多模塊項目)。測試實現是這些具體應用項目之一,由InstrumentationTestCase啓動。在這個測試案例中,我從RoboGuice的圖書館項目中模擬了幾個部分。這意味着我使用模擬類(如持久性處理,數據庫處理等)運行baselib的「真實」實現。爲了做到這一點,每個測試用例都必須關閉並重新啓動整個測試實例,因爲我無法在設備上啓動兩次相同的應用程序。這些測試比Junit測試更集成測試,因爲我測試了某種類型的工作流程,但是沒有其他可能性來測試它,因爲JUnit在Android測試中的可能性似乎非常有限。 目前我只能同時運行一個測試用例,因爲如果我運行超過1個,整個測試都會掛起。我已經檢查過是否導致我的測試凍結的配置更改(請參閱私有方法),但這不是原因。請參閱我的tearDown方法嘗試。我無法運行如何關閉或重新啓動Android InstrumentationTestCase中的測試實例?

getInstrumentation()。finish(0,new Bundle());

,因爲我得到

測試無法運行至完成。原因:'測試運行失敗,至 完成。預期3次測試中,接收到的1'

我還不能運行

getInstrumentation()callActivityOnDestroy(活性)。

因爲我這裏沒有活動。此外,在啓動時啓動的活動「StartTestActivity」與測試完成時運行的活動不同,因爲StartTestActivity啓動了另一個活動「MainMenuActivity」,它在測試結束時運行。我已經考慮過使用Instrumentation.ActivityMonitor,但這不提供所需的功能。儘管如此,我想以某種方式在每個測試案例中以與整個測試本身在啓動時相同的測試條件開始,但我不確定InstrumentationTestCase在後臺執行什麼操作,因此我不知道如何重新啓動整個儀器設置。我以某種方式需要停止並重新啓動測試實例,或者有更好的解決方案?有任何想法嗎? (順便說一句:每個測試本身都運行良好,所以測試本身沒有問題)。

public class WorkflowModule1Test extends InstrumentationTestCase 
{ 
    private PersistenceManagerMock persistenceManager; 

    @Override 
    protected void setUp() throws Exception 
    { 
     super.setUp(); 
    } 

    @Override 
    protected void tearDown() throws Exception 
    { 
     super.tearDown(); 

     if (persistenceManager != null) 
     { 
      persistenceManager.clear(); 
     } 
    } 

    public void testSaveLocaleEN() throws PersistenceException 
    { 
     updateLocaleConfiguration(Locale.ENGLISH); 

     Intent intent = new Intent(getInstrumentation().getContext(), StartTestActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     getInstrumentation().startActivitySync(intent); 

     persistenceManager = (PersistenceManagerMock)RoboGuice.getInjector(ContextProvider.getApplication()).getInstance(IPersistenceManager.class); 

     List<Entity> entities = persistenceManager.getEntities(); 

     assertTrue(entities.size() == 1); 
     assertTrue(entities.get(0) instanceof LanguageUsageRel); 
     assertTrue(((LanguageUsageRel)entities.get(0)).getLanguageId().equals("EN")); 
    } 

    public void testSaveLocaleDE() throws PersistenceException 
    { 
     updateLocaleConfiguration(Locale.GERMAN); 

     Intent intent = new Intent(getInstrumentation().getContext(), StartTestActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     getInstrumentation().startActivitySync(intent); 

     persistenceManager = (PersistenceManagerMock)RoboGuice.getInjector(ContextProvider.getApplication()).getInstance(IPersistenceManager.class); 

     List<Entity> entities = persistenceManager.getEntities(); 

     assertTrue(entities.size() == 1); 
     assertTrue(entities.get(0) instanceof LanguageUsageRel); 
     assertTrue(((LanguageUsageRel)entities.get(0)).getLanguageId().equals("DE")); 
    } 

    private void updateLocaleConfiguration(Locale locale) 
    { 
     Locale.setDefault(locale); 
     Configuration configuration = new Configuration(); 
     configuration.locale = locale; 
     getInstrumentation().getContext().getResources().updateConfiguration(configuration, getInstrumentation().getContext().getResources().getDisplayMetrics()); 
    } 
} 

回答

0

我自己找到了解決方案。我必須設置這兩個標誌。

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
0

我想如果你擴展ActivityInstrumentationTestCase2而不是這會解決很多你的問題。

另一個注意:把你的拆卸邏輯super.tearDown()調用。

+0

如何使用ActivityInstrumentationTestCase2運行測試來測試庫項目中的工作流程?我花了4天的時間爲上面看到的這個案例找到正確的設置。其他解決方案不起作用。不幸的是,沒有關於這一切的良好測試文檔。 – Bevor

相關問題