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



我有以下测试代码。我正在尝试测试列表是否正在从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());
  }
}
我的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);
 }
}

问题是我得到错误:expected<1> got <0>

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

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

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

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

不清楚你想做什么

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

为测试驱动开发设置应用程序,尝试使用尽可能多的pojo(普通旧Java对象)。将活动测试限制在可以模拟的诸如发送intent或pojo之间的集成之类的内容。

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

相关内容

  • 没有找到相关文章

最新更新