0

次のテストコードがあります。リストが 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>

問題は、issueRepository が作成される前に onCreate メソッドが呼び出されることだと思います。IssueRepository をモックして、リストが入力されるのをテストしたいと思います。

私のコードの問題は何ですか、またはこの機能をテストするためのより良い方法はありますか?

どんな助けでも大歓迎です。

4

2 に答える 2

0

あなたが何をしようとしているのかは明らかではありません。

同じクラスに対して 2 つのテストを同時に実行することはできません。ActivityInstrumentationTestCase2 クラスは本質的に、テスト対象のアクティビティのコントローラーおよびラッパーですが、制御できるのは 1 つのアクティビティのみであり、ActivityInstrumentationTestCase2 の複数のインスタンスで同じアクティビティを制御することはできません。

テスト駆動型開発用にアプリをセットアップするには、できるだけ多くの POJO (Plain Old Java Objects) を使用するようにしてください。アクティビティのテストを、インテントの送信やモックできる POJO 間の統合などに制限します。

ActivityInstrumentationTestCase2 は JUnit TestCase サブクラスですが、制限があります。

于 2013-03-12T00:51:12.613 に答える