16

Robolectric のライフサイクル ユーティリティ ( Robolectric.buildActivity().

buildActivity()は Activity オブジェクトの構築を制御するため、Activity のスパイを追加する唯一の場所は、 を呼び出した後buildActivity()です。ただし、スパイは事後に追加すると正しく機能しません。

これは、やActivityController などのライフサイクル メソッドの副作用をスパイする場合に特に当てはまります。これは、ActivityController が後で追加されたスパイではなく、「実際の」Activity オブジェクトへの参照を保持しているためだと思います。create()start()resume()

Robolectric を介してライフサイクル メソッドを呼び出すときにスパイが適切に動作するように、Robolectric で単体テストされているアクティビティをスパイする方法はありますActivityControllerか?

4

2 に答える 2

4

答えは、反射を使用して の「実際の」Activityオブジェクトを置き換えることActivityControllerです。

@Test
public void someTestMethod() throws NoSuchFieldException, IllegalAccessException {
    ActivityController<LoginActivity> ac = Robolectric.buildActivity(LoginActivity.class);
    LoginActivity spiedActivity = spy(ac.get());

    replaceComponentInActivityController(ac, spiedActivity);

    ac.create();

    // do your work
 }

public static void replaceComponentInActivityController(ActivityController<?> activityController, Activity activity)
        throws NoSuchFieldException, IllegalAccessException {
    Field componentField = ComponentController.class.getDeclaredField("component");
    componentField.setAccessible(true);
    componentField.set(activityController, activity);
}

Robolectric3.1でテストしましたが、問題ありません。

于 2016-08-10T08:20:30.057 に答える
1

少なくとも、アクティビティがテスト対象のオブジェクトではなく、テスト対象のフラグメントをホストするダミー アクティビティにすぎない場合は、テスト アクティビティにモックを挿入して、アクティビティ間の通信インターフェイスを介してアクティビティとの相互作用を検証できます。フラグメントとアクティビティ ( http://developer.android.com/training/basics/fragments/communicating.htmlに従う)。

于 2014-01-13T07:31:45.153 に答える