16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-11

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 に書いてる人がいることに気付いた。

16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?