17

我嘗試測試使用ActionBarActivity的Activity(來自appcompat庫)。我需要一個自定義應用程序來操作DI系統來加載我的測試服務,而不是真正的服務。ActivityUnitTestCase和startActivity與ActionBarActivity

如果我有我的測試編寫,並調用startActivity我收到以下錯誤:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 

如果我打電話launchActivityWithIntent活動啓動時沒有任何問題,但它是用我的真正應用類,而不是嘲笑應用類。任何想法如何我可以解決這個問題,或者如何在應用程序的onCreate之後執行代碼,但在我的Activity測試中調用Activity的getCreate之前調用?

回答

2

我發現,如果我創建一個自定義MockApplication並添加以下代碼:

@Override 
public void onCreate() { 
    super.onCreate(); 
    setTheme(R.style.AppTheme); 
} 

我希望會爲其他人正常工作。

+0

我面臨着類似的問題,但我無法得到它的工作。你能分享你的結果嗎? – RobGThai

+1

就像我說過的,我創建了一個擴展了MockApplication的類。然後我用上面的代碼片段覆蓋了onCreate的方法,然後設置了我在ActivityUnitTestCase類中創建的模擬應用程序類的一個實例 – fkrauthan

+0

這對我有用:) –

24

接受的答案並沒有我的情況下工作,但包括這個東西在ActicityUnitTestCase子類工作對我來說:

@Override 
public void setUp(){ 
    ContextThemeWrapper context = new ContextThemeWrapper(getInstrumentation().getTargetContext(), R.style.AppTheme); 
    setActivityContext(context); 
} 
+0

你知道如何使用roboelectric做這項工作嗎? – gaara87

+0

@AkashRamani你是否認爲它是爲了電動汽車?我有同樣的問題 – user3137376

+0

不,很抱歉:/ – gaara87

0

請記住,我們應該創建可重用的活動,並在設定的主題onCreate方法,我們將活動連接到AppTheme。

@Akira Speirs的答案在我看來是最好的選擇,即使我們需要記住在AndroidManifest中更改主題時更新測試。

0

ActivityUnitTestCase.startActivity調度的onCreate所以下面的代碼的伎倆之前調用setActivity:

@Override 
protected void setActivity(Activity testActivity) { 
    if (testActivity != null) testActivity.setTheme(R.style.AppTheme); 
    super.setActivity(testActivity); 
} 

這可能是由@Akira SPEIRS例如,如果自定義上下文需要被使用,只要溶液的替代方案。

0

在我的情況下,我正在測試一個自定義組件作爲佈局的一部分。

只要撥打getActivity().setTheme(...)在測試的setUp()爲我工作。

在真實設備上測試時,我也獲得this error

但是使用啓用HAXM的API級別23 x86仿真器進行測試,它可以正常工作,並且非常快速。

這裏是一個更更完整的setUp()方法爲例:

@Override 
public void setUp() throws Exception { 

    super.setUp(); 

    startActivity(new Intent(getInstrumentation().getTargetContext(), Activity.class), null, null); 

    getActivity().setTheme(R.style.MyAppTheme); 

    getActivity().setContentView(R.layout.my_layout_under_test); 

} 
相關問題