備忘録的に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();
だとダメでした。