【问题标题】:Using ActivityInstrumentationTestCase2 cannot seem to test ListView contents使用 ActivityInstrumentationTestCase2 似乎无法测试 ListView 内容
【发布时间】:2013-03-11 17:54:30
【问题描述】:

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

}

问题是我得到错误:预期得到

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: android mockito android-testing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不清楚你想做什么。

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

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

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

      【讨论】:

      • 但是我没有同时运行两个测试。我有一个与数据库对话的问题存储库,并且 ViewIssueActivity 将数据库中的项目读取到列表中。我需要测试这个功能。
      猜你喜欢
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多