Android 使用ActivityInstrumentationTestCase2似乎无法测试ListView内容

Android 使用ActivityInstrumentationTestCase2似乎无法测试ListView内容,android,mockito,android-testing,Android,Mockito,Android Testing,我有以下测试代码。我试图测试是否正在从SQLite数据库填充列表 public class ViewIssuesActivityTest extends BaseActivityTest<ViewIssuesActivity>{ private List<Issue> issues; public ViewIssuesActivityTest() { super(ViewIssuesActivity.class); } public void

我有以下测试代码。我试图测试是否正在从SQLite数据库填充列表

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());
  }
}
公共类视图IssuseActivityTest扩展了BaseActivityTest{
私人名单问题;
公共视图发布活动测试(){
super(viewsissueactivity.class);
}
public void setUp()引发异常{
super.setUp();
issues=新的ArrayList();
添加(新发行(“试用”、“描述”、“位置”、“图像路径”);
IssueRepository IssueRepository=mock(IssueRepository.class);
doAnswer(新答案){
@凌驾
公共列表应答(invocationMock调用)抛出可丢弃的{
退货问题;
}
}).when(issueRepository).getIssues();
活动。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();
 }
}
公共类BaseActivityTest扩展了ActivityInstrumentationTestCase2{
保护性T细胞活性;
public-BaseActivityTest(类activityClass){
超级(活动类);
}
@凌驾
受保护的void setUp()引发异常{
activity=getActivity();
}
}
我的ViewIssues活动如下:

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);
 }

}
公共类ViewIssuesActivity扩展了ListActivity{
私人发行保兑发行保兑;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(com.change.kranti.R.layout.issues);
issueRepository=新的issueRepository(getApplicationContext());
列表问题=新建ArrayList();
issues=issueRepository.getIssues();
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,问题);
setListAdapter(适配器);
}
}
问题是我得到错误:预期得到

我认为问题在于onCreate方法在创建issueRepository之前被调用。 我想模拟IssueRepository并测试我的列表是否被填充

我的代码有什么问题,或者有没有更好的方法来测试这个功能


任何帮助都将不胜感激。

不清楚您想做什么

不能对同一个类同时运行两个测试。ActivityInstrumentationTestCase2类本质上是被测活动的控制器和包装器,但它只能控制单个活动,并且不能用ActivityInstrumentationTestCase2的多个实例控制同一活动

要设置用于测试驱动开发的应用程序,请尝试使用尽可能多的POJO(普通旧Java对象)。将活动测试限制为可以模拟的内容,例如发送意图或POJO之间的集成


ActivityInstrumentationTestCase2是一个JUnit TestCase子类,但它有局限性。

你说得对。问题是在注入mock
issueRepository
之前调用了
onCreate
方法。在
ActivityInstrumentationTestCase2
的上下文中调用
getActivity
时,将调用所有常用的生命周期方法(即
onCreate
onStart
onResume
)。当您的测试代码调用
setIssueRepository
时,已经太晚了,问题已经从存储库中获取


在这种情况下,我知道的最好的解决方案是使用依赖注入,无论是手动还是使用DI框架。

但我并不是同时运行两个测试。我有一个与DB对话的IssuerPository,ViewIssueActivity将项目从DB读取到列表。我需要测试这个功能。