Robolectricでrecreateを呼び出すと(Robolectricを使用するときに古いAPIバージョンについて心配する必要がないことに注意してください)、構成変更のシミュレーションにかなり近いですが、発生する可能性のあるすべてのエラーを必ずしもキャッチできるわけではありません。特に、アクティビティの新しいインスタンスは作成されません(そして、それを「スクラブ」しないと確信しています)。したがって、アクティビティのメンバーフィールドを復元するのを忘れた場合、テストはそれをキャッチしません。ただし、フラグメントのテストには十分に機能します(保持されていないフラグメントは破棄され、再インスタンス化されます)。
Robolectricテストのアクティビティでrecreateを呼び出すと、次のようになります。
- onSaveInstanceState
- onPause
- onStop
- onDestroy
- onCreate
- onStart
- onRestoreInstanceState
- onResume
(これは、テストアクティビティのほとんどのライフサイクルメソッドをオーバーライドし、ログステートメントをそれらに配置することでわかりました)
次のようなコードを使用すると、実際の構成変更に少し近づくことができます。
Bundle bundle = new Bundle();
activityController.saveInstanceState(bundle).pause().stop().destroy();
controller = Robolectric.buildActivity(YourActivity.class).create(bundle).start().restoreInstanceState(bundle).resume();
activity = controller.get();
(このコードはRobolectric 2.1用です-2.2以上を使用している場合は、.visible()
その後に電話をかける必要があります.resume()
)
上記を使用すると、次のイベントが発生することがわかります。
- onSaveInstanceState
- onPause
- onStop
- onDestroy
- インスタンス化されたアクティビティの新しいインスタンス(以降のすべての呼び出しはこの新しいインスタンスで行われます)
- onCreate
- onStart
- onRestoreInstanceState
- onResume
- onPostResume
これはまだ完全に一致しているわけではありませんが、実際の構成変更が発生したときに発生することにはるかに近いものです。
これは、recreate()の呼び出しとは異なり、メモリ不足のためにアクティビティが破棄されたときに何が起こるかについての適切なシミュレーションであると思います。これにより、保持されたフラグメントへの参照が保持されるとは思いません。私はこの地域で不安定な地面にいます!
アップデート:
アクティビティがインテントを介して開始された場合は、次のようにwithIntentへの呼び出しを追加する必要があります。
Robolectric.buildActivity(YourActivity.class).withIntent(intent).create(bundle) // and so on...