web-dev-qa-db-ja.com

Robolectricはリソースまたはマニフェストファイルを見つけることができません

新しいTestProjectを作成し、testMethodに次の行を追加しました。

Robolectric.getShadowApplication().getString(R.string.mystring);

私のテストはで失敗しました

Android.content.res.Resources$NotFoundException: unknown resource 2131558482

コンソールに次の警告が表示されます。

WARNING: No manifest file found at .\..\..\MyProject\AndroidManifest.xml.Falling back to the Android OS resources only.
To remove this warning, annotate your test class with @Config(manifest=Config.NONE).
WARNING: no system properties value for ro.build.date.utc

文字列リソースを取得するにはAndroidManifest.xmlが必要ですか? org.robolectric.Config.propertiesおよび@ Configでマニフェストを追加しようとしましたが、それでも警告が発生し、文字列リソースを取得できません。マニフェストへの相対パスが正しいことを確認しました。また、JUnitの実行構成を変更しようとしましたが、これは役に立ちませんでした。

17
lukjar

ここで説明されている問題の解決策: http://blog.futurice.com/Android_unit_testing_in_ides_and_ci_environments

欠落しているマニフェスト

RobolectricがAndroidマニフェストを見つけられないことについて不平を言っていることに気付いたはずです。カスタムテストランナーを作成することで修正します。以下をapp/src/test /として追加します。 Java/com/example/app/test/RobolectricGradleTestRunner.Java:

package com.example.app.test;

import org.junit.runners.model.InitializationError;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.res.Fs;

public class RobolectricGradleTestRunner extends RobolectricTestRunner {
  public RobolectricGradleTestRunner(Class<?> testClass) throws InitializationError {
    super(testClass);
  }

  @Override
  protected AndroidManifest getAppManifest(Config config) {
    String myAppPath = RobolectricGradleTestRunner.class.getProtectionDomain()
                                                        .getCodeSource()
                                                        .getLocation()
                                                        .getPath();
    String manifestPath = myAppPath + "../../../src/main/AndroidManifest.xml";
    String resPath = myAppPath + "../../../src/main/res";
    String assetPath = myAppPath + "../../../src/main/assets";
    return createAppManifest(Fs.fileFromPath(manifestPath), Fs.fileFromPath(resPath), Fs.fileFromPath(assetPath));
  }
}

テストクラスのRunWithアノテーションを変更することを忘れないでください。

14
user3635764

同じエラーに直面しました。いくつかのフレーバーとビルドタイプを使用したので、それを機能させるための手順があります。

1)Androidスタジオテスト実行構成

Windowsでも作業ディレクトリを$ MODULE_DIR $に設定する必要があります。 http://robolectric.org/getting-started/ そう言うべきです。

2)ユニットテストには次のような注釈を付ける必要があります。

@RunWith(RobolectricTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21, manifest = "src/main/AndroidManifest.xml", packageName = "com.example.yourproject") 
public class SomeFragmentTest {

ここにマニフェストファイルとpackageNameへのプレーンリンクがあります

7
Kirill Vashilo

4.0バージョンから、@ Configの使用は高く評価されていませんが、更新されたスタートガイドが私の問題を解決します: http://robolectric.org/getting-started/

Build.gradleを1つ変更し、マニフェストファイルをロードすると、テストを実行できます。

Android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

Githubの関連する問題(これもクローズされています): https://github.com/robolectric/robolectric/issues/3328

2
Levente Takács

AndroidManifest.xmlが必要であり、Robolectricは現在、パスが示すようにプロジェクトルートにあることに依存しています。

1
Corey D

テストクラスの一番上でこのようなマニフェストを宣言していたことに気づきました

@RunWith(RobolectricTestRunner.class)
@Config( constants = BuildConfig.class, manifest="app/src/main/AndroidManifest.xml", sdk = 21 )

そして、私は今、働くためにこれに切り替えました。

@RunWith(RobolectricTestRunner.class)
@Config( constants = BuildConfig.class, manifest="src/main/AndroidManifest.xml", sdk = 21 )
1
Juan Mendez

RobolectricTestRunnerをサブクラス化してgetConfigProperties()をオーバーライドしました。このリンクをたどってください: https://stackoverflow.com/a/29907234/727654

0
Nishant Soni

Robolectric(ver:robolectric-2.4-jar-with-dependencies.jar)で同じ問題を解決し、さまざまな値からリソースをロードしながら不明なリソースを返しました-*フォルダー例:

<resources>
    <string name="screen_type">10-inch-tablet</string>
</resources>

私の場合、さまざまなデバイスを認識したかったのです。このため、次のフォルダーにscreen.xmlを作成しました。

values/screen.xml - mobile
values-sw600dp/screen.xml - 7-inch tablet
values-sw720dp/screen.xml - 10-inch tablet

私のワークスペースは次のとおりです。

workspace
   \-ExProj
       \-exProj
            \-src
                \-exProj
                    \-AndroidManifest.xml
   \-ExProjTest

Robolectricを使用したユニットテスト:

@RunWith(RobolectricTestRunner.class)
@Config(manifest = "./../ExProj/exProj/src/exProj/AndroidManifest.xml")
public class UtilityTest {

  @Test
   @Config(qualifiers = "sw720dp")
    public void testIfDeviceIsTablet() throws Exception {
     System.out.println(Robolectric.application.getString(R.string.screen_type));
    }
}

上記のテストコードがコンソールに出力されます:10インチタブレット...

0
damax