色々探したが動かなかったりしたので、一応まとめる。
1,適当なアクティビティのテストを作成する。
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);
}
}