LoginSignup
18
18

More than 5 years have passed since last update.

Androidのテストについて考える AsyncTaskLoader編

Last updated at Posted at 2015-02-11

備忘録的にAndroidの機能毎にオーソドックスなテストを書いていくシリーズです。
もっと効率的な方法ありましたら教えて下さい。

AsyncTaskLoader.java
public class MyAsyncTaskLoader
        extends AsyncTaskLoader<List<MyAsyncTaskLoader.Model>>
{
    /**
     * 便宜上Modelもクラス内クラスとする
     */
    static public class Model
    {
        public int id;
        public String name;
        public String date;

        public int getId()
        {
            return id;
        }

        public String getName()
        {
            return name;
        }

        public String getDate()
        {
            return date;
        }
    }

    public MyAsyncTaskLoader(Context context)
    {
        super(context);
    }

    // 非同期処理の中身
    @Override
    public List<Model> loadInBackground()
    {
        ArrayList<Model> models = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Model model = new Model();
            model.id = i;
            model.name = "Sato " + i;
            model.date = "2014-02-04 01:00:00";
            models.add(model);
        }
        return models;
    }
}

このAsyncTaskLoaderのユニットテストを書いてみる。

AsyncTaskLoaderTest.java
public class MyAsyncTaskLoaderTest
    extends ActivityInstrumentationTestCase2<AsyncTaskLoaderActivity> {
  private AsyncTaskLoaderActivity mActivity;

  public MyAsyncTaskLoaderTest() {
    super(AsyncTaskLoaderActivity.class);
  }

  public void setUp() throws Exception {
    super.setUp();
    setActivityInitialTouchMode(false);
    mActivity = getActivity();
  }

  @Test
  public void testAsyncTaskLoader_GetItem() throws Exception {
    mActivity.runOnUiThread(new Runnable() {
      @Override
      public void run() {
        final CountDownLatch latch = new CountDownLatch(1);
        Loader loader = mActivity.getLoaderManager()
            .initLoader(0, null,
                new LoaderManager.LoaderCallbacks<List<MyAsyncTaskLoader.Model>>() {
                  @Override
                  public Loader<List<MyAsyncTaskLoader.Model>> onCreateLoader(int id, Bundle args) {
                    return null;
                  }

                  @Override
                  public void onLoadFinished(Loader<List<MyAsyncTaskLoader.Model>> loader,
                      List<MyAsyncTaskLoader.Model> data) {
                    MyAsyncTaskLoader.Model model = data.get(0);
                    assertEquals(0, model.getId());
                    assertEquals("Sato 0", model.getName());

                    latch.countDown();
                  }

                  @Override
                  public void onLoaderReset(Loader<List<MyAsyncTaskLoader.Model>> loader) {

                  }
                });

        loader.forceLoad();
        boolean res = false;
        try {
          res = latch.await(10, TimeUnit.SECONDS);
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
        assertTrue(res);
      }
    });
  }
}

ポイントは CountDownLatch.awaitで非同期処理が終わるのを待つこと。
getInstrumentation().waitForIdleSync();だとダメでした。

18
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
18