読者です 読者をやめる 読者になる 読者になる

【Android】AsyncTaskLoaderのテスト

色々探したが動かなかったりしたので、一応まとめる。

1,適当なアクティビティのテストを作成する。

f:id:noifuji:20151104013451p:plain

2,あらかじめ作成したAsyncLoaderに対して以下のコードを、テストケースに追加する。(赤字は書き換える)

 

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

private static final String TAG = "MainActivityTest";
private MainActivity mActivity;
CountDownLatch mLatch;

public MainActivityTest() {
super(MainActivity.class);
}

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

@Test
public void testAsyncTaskLoader() throws Exception {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "run");
mActivity.getLoaderManager().initLoader(0, null,
new LoaderManager.LoaderCallbacks<AsyncResult<JSONArray>>() {
@Override
public Loader<Loaderのジェネリクス> onCreateLoader(int id, Bundle args) {
Log.d(TAG, "onCreateLoader");
作成したAsyncLoader名 loader = new 作成したAsyncLoader名(mActivity, 引数);
                         loader.forceLoad();
return loader;
}

@Override
public void onLoadFinished(Loader<Loaderのジェネリクス> loader,
Loaderのジェネリクス data) {
                       Log.d(TAG, "onLoadFinished");

//実行結果が正しいかここでチェックする。

mLatch.countDown();
}

@Override
public void onLoaderReset(Loader<Loaderのジェネリクス> loader) {
                     }
});
}
});
//UIスレッドが終了するまで待つ
boolean res = false;
Log.d(TAG, "await");
try {
res = mLatch.await(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "assert true");
assertTrue(res);
}

}