Parcelable
インターフェイスを実装したクラスについて、Bundle
などへの保存とそこからの復元の機能をテストしたい。
ちょっと調べると、Parcel
に直接 Parcelable
なオブジェクトを保存して復元する方法を使ってユニットテストするという方法がいくつか見つかる。
- Stuff I keep Forgetting How to Do: Unit Test Your Custom Parcelable
- Parcelableなクラスの単体テスト - _development,
これらの方法だと、復元時に YourParcelableClass.CREATOR.createFromParcel(parcel)
という感じでテスト対象のクラスの CREATOR
を明示的に指定する必要がある。 もうちょっといい方法にしたいなー、と思って、いったん Bundle
に追加した後、その Bundle
を Parcel
に保存して復元する方法を使うことにした。
// 必要な 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 に書いてる人がいることに気付いた。