新しい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の実行構成を変更しようとしましたが、これは役に立ちませんでした。
ここで説明されている問題の解決策: 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アノテーションを変更することを忘れないでください。
同じエラーに直面しました。いくつかのフレーバーとビルドタイプを使用したので、それを機能させるための手順があります。
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へのプレーンリンクがあります
4.0バージョンから、@ Configの使用は高く評価されていませんが、更新されたスタートガイドが私の問題を解決します: http://robolectric.org/getting-started/
Build.gradleを1つ変更し、マニフェストファイルをロードすると、テストを実行できます。
Android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
Githubの関連する問題(これもクローズされています): https://github.com/robolectric/robolectric/issues/3328
AndroidManifest.xml
が必要であり、Robolectricは現在、パスが示すようにプロジェクトルートにあることに依存しています。
テストクラスの一番上でこのようなマニフェストを宣言していたことに気づきました
@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 )
RobolectricTestRunnerをサブクラス化してgetConfigProperties()をオーバーライドしました。このリンクをたどってください: https://stackoverflow.com/a/29907234/727654
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インチタブレット...