2011-04-11 82 views
1

我在Android上執行單元測試時遇到了相當多的麻煩。作爲一個簡單的測試,我一直試圖以匹配字符串資源中檢索到的字符串:Android單元測試和接口

String myString = myActivity.getResources().getString(R.string.testString)); 

然而,當單元測試此總是導致一個空指針異常。這包括robolectric以及隨Android sdk一起提供的Junit實現。

一種可能的解決方案是以類似於數據訪問對象的方式來獲取資源。也就是說,創建一個接口來訪問字符串資源。這將允許我模擬訪問字符串資源。同樣,我可以將Activity的非android依賴行爲分離爲一個單獨的pojo類。這將允許我使用標準的Java測試工具來運行單元測試。實際上,我可能會將任何與Android基礎架構相關的活動委託給接口。

這似乎是很多跳過箍環來進行單元測試。這值得麼?有沒有更可行的方法?

回答

2

原來,問題是活動必須在實際的測試方法中得到。因此,例如,我的方法現在看起來像這樣:

public void testGetActivityResourceString() { 

    Activity myActivity = this.getActivity(); 
    String myString = myActivity.getResources().getString(R.string.hello); 
    Assert.assertNotNull(myString); 
} 

而我在安裝程序中創建活動之前。這個贈品在文檔中:

「對於每個測試方法調用,只有在第一次調用此方法時纔會實際創建Activity。」

這是一個真正的麻煩要弄清楚。 HelloWorldTest的例子不能用於同樣的原因。

下面是完整的條目:

公共牛逼getActivity() 自:API等級3 獲取被測活動,必要時啓動它。

對於每個測試方法調用,只有在第一次調用此方法時纔會實際創建Activity。

如果您希望爲您的活動提供自定義設置值,您可以在第一次調用getActivity()之前調用setActivityIntent(Intent)和/或setActivityInitialTouchMode(boolean)。活動開始後調用它們將不起作用。

注意:被測試的活動不能從UI線程內開始。如果您的測試方法使用UiThreadTest註釋,那麼您的Activity將在測試方法運行之前自動啓動。您仍然調用此方法以獲取待測活動。

0

這正常工作:

public void testGetResourceString() { 
    assertNotNull(mActivity.getResources() 
      .getString(com.example.pkg.R.string.testString)); 
} 

因爲你沒有提供任何代碼,但只有getReousrces()行的,我會想你在做什麼錯了:你不使用

  1. 爲您的測試使用正確的基類,使用ActivityInstrumentationTestCase2,因爲您需要系統基礎結構
  2. 您正在使用測試項目的資源而不是測試的項目,這就是爲什麼在我的示例中,id i s com.example.pkg.R.string.testString