2013-03-11 22 views
0

我有以下測試代碼。我試圖測試一個列表是否正從SQLite數據庫填充。使用ActivityInstrumentationTestCase2似乎無法測試ListView內容

public class ViewIssuesActivityTest extends BaseActivityTest<ViewIssuesActivity>{ 

    private List<Issue> issues; 

    public ViewIssuesActivityTest() { 
    super(ViewIssuesActivity.class); 
    } 

    public void setUp() throws Exception { 
    super.setUp(); 
    issues = new ArrayList<Issue>(); 
    issues.add(new Issue("Trial","Desc","Location","ImagePath")); 
    IssueRepository issueRepository = mock(IssueRepository.class); 


    doAnswer(new Answer<Object>() { 
     @Override 
     public List<Issue> answer(InvocationOnMock invocation) throws Throwable { 
      return issues; 
     } 
    }).when(issueRepository).getIssues(); 
    activity.setIssueRepository(issueRepository); 

    } 

    public void testNumberOfIssuesRecorded() { 
    ListView listView = (ListView) activity.findViewById(android.R.id.list); 
    assertEquals(1, listView.getCount()); 
    } 
} 

我BaseActivityTest代碼:

public class BaseActivityTest<T extends Activity> extends ActivityInstrumentationTestCase2<T> { 

protected T activity; 

public BaseActivityTest(Class<T> activityClass) { 
    super(activityClass); 
} 

@Override 
protected void setUp() throws Exception { 
    activity = getActivity(); 
} 
} 

我ViewIssuesActivity如下:

public class ViewIssuesActivity extends ListActivity{ 

private IssueRepository issueRepository; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 

super.onCreate(savedInstanceState); 
setContentView(com.change.kranti.R.layout.issues); 
issueRepository = new IssueRepository(getApplicationContext()); 

List<Issue> issues = new ArrayList<Issue>(); 
issues = issueRepository.getIssues(); 
ArrayAdapter<Issue> adapter = new ArrayAdapter<Issue>(this, 
    android.R.layout.simple_list_item_1, issues); 

setListAdapter(adapter); 
} 

} 

的問題是,我得到錯誤:預期< 1>得到< 0>

我認爲問題是onCreate方法在我之前被調用ssueRepository被創建。 我想嘲笑IssueRepository並測試我的列表正在填充。

我的代碼有什麼問題,或者有更好的方法來測試這個功能。

任何幫助將不勝感激。

回答

1

你說得對。問題是在模擬issueRepository被注入之前調用onCreate方法。當您在ActivityInstrumentationTestCase2的環境中調用getActivity時,會調用所有常用生命週期方法(即onCreate,onStartonResume)。當您的測試代碼調用setIssueRepository時,已經太晚了,問題已從存儲庫中獲取。

在這種情況下,我所知道的最佳解決方案是使用依賴注入,無論是通過手動還是使用DI框架。

0

目前尚不清楚你想要做什麼。

您不能同時對同一個類運行兩個測試。 ActivityInstrumentationTestCase2類本質上是被測活動的控制器和包裝器,但它只能控制單個Activity,並且不能使用ActivityInstrumentationTestCase2的多個實例控制相同的Activity。

要設置測試驅動開發的應用程序,儘量使用盡可能多的POJO(普通舊Java對象)。將活動測試限制爲發送內容或可以模擬的POJO之間的集成。

ActivityInstrumentationTestCase2是一個JUnit TestCase子類,但它有侷限性。

+0

謝謝您的回覆。 – Nazneen 2013-03-12 04:29:24

+0

但我沒有同時運行兩個測試。我有一個與數據庫對話的issueRepository,ViewIssueActivity將數據從數據庫讀取到列表中。我需要測試這個功能。 – Nazneen 2013-03-12 04:59:52

相關問題