7

CommentActivity通常は のインスタンスを構築して使用するAndroid アクティビティをテストしたいと考えていますCommentsDataSource(どちらも私が作成したクラスです)。

public class CommentActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    :
    CommentsDataSource = new CommentsDataSource(..);
    :
  }
  :
}

私はMockCommentsDataSource自分で作成したいと考えており、サードパーティのモック フレームワークの使用を避けたいと考えています。(なぜですか?私は、学期に詰め込む必要がある情報の量と、生徒がインストールする必要のあるソフトウェアの量を削減しようとしているためです。Guice、roboguice、Spring を推奨する他の投稿を見たことがあります。)

私の質問は、アクティビティにCommentsDataSource(または) を渡す方法です。それらをorにするのは実用的ではMockCommentsDataSourceないようです。デバッグ フラグを簡単に渡すことはできますが、それを使用するにはについて知る必要があります。これは実際には (別のアプリケーションでは) 関係ありません。SerializableParcelableIntentCommentActivityCommentActivityMockCommentsDataSource

public class CommentActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    :
    debugMode = getIntent().getBooleanExtra(DEBUG_MODE, false);

    // Get a connection to the database.
    final CommentsDataSource cds = (debugMode ? 
      new MockCommentsDataSource() :   // Abstraction violation
      new CommentsDataSource(this));
      :
   }
   :
}

にどのように注入すればよいMockCommentsDataSourceですCommentActivityか? FWIW、私はEclipseを使用しており、最近のSDKバージョン用に開発しています。

私が思いつく解決策の 1 つは、抽象ファクトリ パターンを使用することです。ファクトリをシリアライズ可能にするのは比較的簡単だからです。私の制約を考えると、それが最善のアプローチですか?

4

2 に答える 2

0

プライベート静的フィールドを使用して依存関係を注入する、シンプルで醜いソリューションを提供します。

private static Client client;

リフレクションを使用してテストからフィールド値を設定します。

public static void setStaticFieldValue(final Class<?> clazz, 
        final String name, final Object value) throws Exception {
    final Field field = clazz.getDeclaredField(name);
    field.setAccessible(true);
    field.set(null, value);
}

次に、つまりonCreate()、フィールドが設定されている場合はその「注入された」テストインスタンスを使用し、それ以外の場合は通常のテストインスタンスを使用します。

醜いですが、テスト対象のクラスへのテストに関連する変更はほとんど必要ありません。

于 2015-09-08T16:57:15.153 に答える