Edited at

Android の Parcelable なオブジェクトの保存と復元のユニットテスト

More than 3 years have passed since last update.

Parcelable インターフェイスを実装したクラスについて、Bundle などへの保存とそこからの復元の機能をテストしたい。

ちょっと調べると、Parcel に直接 Parcelable なオブジェクトを保存して復元する方法を使ってユニットテストするという方法がいくつか見つかる。

これらの方法だと、復元時に YourParcelableClass.CREATOR.createFromParcel(parcel) という感じでテスト対象のクラスの CREATOR を明示的に指定する必要がある。 もうちょっといい方法にしたいなー、と思って、いったん Bundle に追加した後、その BundleParcel に保存して復元する方法を使うことにした。

// 必要な import 文。

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

/**
* {@link Parcelable} を {@link Parcel} に保存したあと復元して返す。 テスト用。
* @param value 保存して復元する対象。
* @param <T> 対象の型。
* @return 復元した後の値。
*/

private static <T extends Parcelable> T saveToAndRestoreFromParcel(T value) {
String key = "key";
Parcel p = Parcel.obtain();
try {
Bundle bundle = new Bundle();
bundle.putParcelable(key, value);
p.writeBundle(bundle);

p.setDataPosition(0);
Bundle restoredBundle = p.readBundle(value.getClass().getClassLoader());
return restoredBundle.getParcelable(key);
} finally {
p.recycle();
}
}

こういうメソッドを 1 個用意しておけば、あとは任意の Parcelable なオブジェクトをこのメソッドに渡すことで、保存して復元した後のオブジェクトを取得できる。

YourParcelableClass restoredObj = saveToAndRestoreFromParcel(obj);

って書いたところで、ほぼ同じことを Stack Overflow に書いてる人がいることに気付いた。