2011-11-22 36 views
3

我是相當新的測試,並試圖探索jUnit測試和Robotium。我的應用程序有4個屏幕。Android jUnit TestCase:活動onCreate()實際上何時被調用?

Splash Screen --> Screen2--> Screen 3--> Autocomplete Screen. 
[init()]        [ check values generated by init() method] 

自動完成屏幕是用戶輸入內容的地方,應用程序會從產品的大型數據庫執行自動完成。在啓動畫面中,我正在使用另一個類中的init()方法初始化許多應用程序變量。這個init()方法將加載usedr首選項,檢查數據庫的創建等...(產品數據庫預先打包在apk中,我在第一次啓動時複製數據庫並將其標記爲SharedPreferences,如copied = true)。

問題:我如何隔離自動完成屏幕的測試? AutocompleteActivity的onCreate依賴於SplashScreen中調用的init()。我不確定何時jUnit創建了Activity的實例,(可能在構造函數中?)。這裏是我的TestCaseCode:

import android.test.ActivityInstrumentationTestCase2; 
import android.view.View; 
import android.widget.ListView; 

import com.jayway.android.robotium.solo.Solo; 
import com.supervalu.mobile.android.AutoCompleteActivity; 
import com.supervalu.mobile.android.db.LocalDb; 

public class AutocompleteTest extends 
     ActivityInstrumentationTestCase2<AutoCompleteActivity> { 
private Solo solo; 

public AutocompleteTest() { 
    super("com.****.*****.*****", AutoCompleteActivity.class); 
} 

protected void setUp() throws Exception { 
    super.setUp(); 
    LocalDb.init(getActivity().getApplicationContext()); 
    solo = new Solo(getInstrumentation(), getActivity()); 

} 

public void test1Character() { 
    solo.sleep(2000); 
    solo.enterText(0, "c"); 
    solo.sleep(10000); 
View v = getActivity().findViewById(
      com.*****.****.*****.R.id.list); 
    solo.waitForView(v); 
    assertTrue(((ListView) v).getChildCount() > 0); 


} 

public void test3Character() { 
    LocalDb.init(getActivity().getApplicationContext()); 
    solo.enterText(0, "che"); 
    View v = getActivity().findViewById(
      com.*****.****.*****.R.id.list); 
    solo.waitForView(v); 
    assertTrue(((ListView) v).getChildCount() > 0); 
} 

protected void tearDown() throws Exception { 

    solo.finishOpenedActivities(); 
    super.tearDown(); 

} 

測試用例保持creashing,因爲需要的onCreate從LocalDb whcih必須由init()方法initialiazed一些值。

我不能在構造函數中的超級調用之前添加init()函數。是否有任何解決此問題的方法,或者是否需要從啓動屏幕啓動測試用例?

問題2:如果我從啓動屏幕開始測試,我必須先導航到autocmplete屏幕,然後才能對其執行任何測試。假設我也這樣做了,那麼對於每個測試:test1character()該類執行setUp(),然後測試然後tearDown(),然後重新啓動test3characters()函數的整個序列。在實際測試輸入之前,每次都重複導航到自動合併屏幕會非常痛苦。對此也有任何建議?

我不知道採取什麼方法。有人能指導我嗎?

回答

0

我真的不明白你的問題,但我會盡力幫助。

爲了執行活動開始(並調用到它的的onCreate回調)是具有:

getActivity(); 

的通常的地方它是在setUp()方法(每個測試之前調用)。

正如你所說的每個測試setUp()tearDown()方法被稱爲。

我認爲測試應用程序導航的最佳方式是在一個簡單的測試中,並創建所有意圖,因爲您需要啓動所有要測試的活動。

我希望它有幫助。

0

如果您正在進行單元測試,您應該將您的測試類擴展到ActivityUnitTestCase以測試單個活動並使用將調用您的onCreate的startActivity方法。 ActivityInstrumentationTestCase2用於對活動進行功能測試。

看到來自Android的參考文檔更多...

下測試啓動活動,以同樣的方式,就好像它是由Context.startActivity開始(),它提供所提供的參數。當您使用此方法啓動活動時,它將通過tearDown()自動停止。

此方法將調用onCreate(),但如果您希望進一步練習Activity生命週期方法,則必須自己從測試用例中調用它們。

不要從你的setUp()方法調用。您必須從每種測試方法調用此方法。

3

我有一個類似的問題,並能夠解決它。 在你的setUp()方法中,調用getActivity()是沒有用的。它不會影響您的測試方法。 你必須使用:

getInstrumentation().getTargetContext() 

例如使用

getInstrumentation().getTargetContext().getContentResolver() 

,而不是

getActivity().getContentResolver() 

希望這對你的作品!

Cheers Antonino

相關問題