3

Android プロジェクトのアクティビティに依存関係を挿入するために Dagger を使用しています。すべてのプロバイダーは、Applicationサブクラスによって格納および管理される 1 つのモジュールに保持されます。アクティビティは依存関係を に注入しonCreate()、コンテキストからモジュールを取得します。

テストでは、デフォルトのモジュールを別のモジュールに交換する必要がある場合があります。を使用してActivityAndroidTestCase2います。を呼び出す前にアプリケーション コンテキストを取得し、getActivity()次のようにモジュールを置き換えます。

Context applicationContext = getInstrumentation()
    .getTargetContext().getApplicationContext();
module.setAppContext(applicationContext);
Thread.sleep(1000);         // note this
((ObjectGraphProvider) applicationContext).setModule(module);

MyApplicationコード:

public class MyApp extends Application implements ObjectGraphProvider {

    private ObjectGraph objectGraph;
    private Object module;

    public MyApp() {
        super();
        ApplicationContextModule myModule = new DefaultModule();
        myModule.setAppContext(this);
        this.module = myModule;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        objectGraph = ObjectGraph.create(module);
    }

    @Override
    public ObjectGraph objectGraph() {
        return objectGraph;
    }

    /* Test only */
    public void setModule(Object module) {
        this.module = module;
        objectGraph = ObjectGraph.create(module);
    }
}

sleep()悲しいことに、テストはときどき失敗します。それが最初のコード スニペットの理由です。スレッドがスリープする時間が長いほど、失敗の可能性は低くなりますが、問題が完全に解決されるわけではありません。

この奇妙な動作の原因と、この問題を解決する方法についてのアイデアはありますか?

4

1 に答える 1

1

Dagger と Cucumber-jvm を使用したテストで同様の問題が発生しました。注意すべきいくつかの落とし穴を次に示します。

  • オブジェクト グラフを新しいグラフに設定するときは、古いグラフのコンポーネントへの参照が残っていないことを確認してください。これは、システム内でまだアクティブであり、グラフによって注入されたオブジェクトへの参照を保持している可能性があるアクティビティ、サービス、BroadcastReceivers などを意味します。グラフをリセットする前に、開いているアクティビティをすべて終了することを検討してください。私の場合、古いグラフから挿入された参照に固執するバックグラウンド サービスがありました。stopSelf()テストの実行間でサービスが固執しないようにするために、サービスを明示的に呼び出す必要がありました。これにより、再起動時に新しいグラフからインジェクションを取得できました。
  • PendingIntents、Notifications、および ID を取るその他の Android パーツには、完全にランダムな ID を使用します。PendingIntents で誤って ID を再利用していたため、トリッキーなエラーが発生しました。
  • グラフをリセットする前後に持続する他の状態を探します。私は最終的に、アプリの状態を完全にクリアして最初からやり直す手順を思いつきました。すべての共有設定をクリアし、すべての通知をキャンセルし、開いているすべてのアクティビティを終了してから、グラフをリセットします。
于 2014-08-23T13:43:57.910 に答える