2

問題の解決策を見つけたので、これは正確な質問ではありません。それに遭遇する可能性のある他の人に役立つことを願っています。

Robolectric を使用して、ライブラリ (実際には複数のライブラリ) を使用するプロジェクトの単体テストを作成します。ライブラリとアプリケーションは多くのリソースを使用します。

Eclipse ワークスペースに、Android ライブラリを作成するプロジェクト ライブラリ (最上位パッケージとして "library.package" を使用) と、ライブラリを使用するプロジェクト アプリケーション (最上位に "app.package" を使用) が含まれているとします。プロジェクト Test は、Application プロジェクトを参照する Robolectric プロジェクトです。

突然、アクティビティ内の特定のビューの存在をチェックする非常に単純なテストが失敗することがわかりました。例えば:

@Test
public void testProgressBarInit() {
    LoginActivity activity = Robolectric.buildActivity(LoginActivity.class).create().get();

   assertTrue(activity.findViewById(R.id.status_text) instanceof TextView);

}

ライブラリ プロジェクトは、LoginActivity を実装し、適切なリソース (レイアウト) を定義します。コード構造を少し変更してもう 1 つのライブラリを削除する前に、失敗したテストは完全に実行されます。

デバッガーでテストを実行すると、findViewById 呼び出しが Application/gen/R.java ファイルから取得した R.id.status_text の正しい値を使用することが示されました。同時に、Application/gen/R.java の R.id.status テキストの値が Library/gen/R.java の値と異なることを発見しました。また、Appication/gen ディレクトリには、Application/gen/R.java と同じ status_text の値を含むファイル library.package.R.java が含まれています (Library/gen/R.java の元の値とは異なります)。ライブラリとアプリケーションからリソースをマージする際にリソース ID を変更できるのは、aapt ツールの通常の動作です。

4

1 に答える 1