web-dev-qa-db-ja.com

Robolectric:Resources $ NotFoundException:Android Gradle Plugin 3の文字列リソースID

Android Studio 3.0 Beta2
classpath 'com.Android.tools.build:gradle:3.0.0-beta3'
testCompile 'org.robolectric:robolectric:3.4.2'

私が使用しているテストクラスは実行に失敗します:

@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.Lollipop)
@RunWith(RobolectricTestRunner.class)
public class RecipeAdapterTest {
    private MainActivity activity;

    @Before
    public void setup() {

    activity = Robolectric.setupActivity(MainActivity.class);

    /* Also tried this same Error
     activity = Robolectric.buildActivity(MainActivity)
                .create()
                .resume()
                .get();
    */
    }

    @Test
    public void testActivityShouldNotBeNull() {
        assertThat(activity, is(notNullValue()));
    }
}

これはエラーのスタックトレースです:

Android.content.res.Resources$NotFoundException: String resource ID #0x7f0c0020

    at Android.content.res.Resources.getText(Resources.Java:274)
    at Android.content.res.Resources.getString(Resources.Java:360)
    at Android.content.Context.getString(Context.Java:376)
    at org.robolectric.shadows.ShadowActivity.getActivityTitle(ShadowActivity.Java:100)
    at org.robolectric.shadows.ShadowActivity.callAttach(ShadowActivity.Java:110)
    at org.robolectric.Android.controller.ActivityController.attach(ActivityController.Java:56)
    at org.robolectric.Android.controller.ActivityController.of(ActivityController.Java:25)
    at org.robolectric.Robolectric.buildActivity(Robolectric.Java:98)
    at org.robolectric.Robolectric.buildActivity(Robolectric.Java:94)
    at org.robolectric.Robolectric.setupActivity(Robolectric.Java:102)
    at me.androidbox.busbybaking.adapters.RecipeAdapterTest.setup(RecipeAdapterTest.Java:63)

Edit Configurationsで、Working Directory$MODULE_DIR$に設定しました

提案に感謝します。

39
ant2009

前述のとおり Googleチームのエンジニアによる(おそらく Xavier Ducrohet )、RobolectricにはAAPT2の問題があります。

Robolectricはaapt2と互換性がありません。

ここに2つのオプションがあります。

最初のオプション-Robolectricに従います Android Studio 3.0 + のガイドライン

Build.gradleに次を追加します。

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

Robolectricテストランナーでテストに注釈を付けます。

@RunWith(RobolectricTestRunner.class)
public class SandwichTest {
}

2番目のオプション:AAPT2を無効にして、次の行をgradle.propertiesファイルに追加します。

Android.enableAapt2=false
64
azizbekian

Robolectric documentation は、Android Studio 3.xで次の構成を使用する必要があることを示しています。

Android {
  testOptions {
    unitTests.includeAndroidResources true
  }
}
6
sfera

AAPT2リソース処理の問題が原因でビルドが失敗した場合、またはRoboelectricを使用する場合は、AAPT2Android.enableAapt2=falsegradle.propertiesファイルに設定し、 を実行してGradleデーモンを再起動する./gradlew --stop コマンドラインから。

公式ガイドラインAndroid Studio 3.0リリース

2
IntelliJ Amiya

(同様の問題の解決策を探しているかもしれない人のために)


必ず使用してください

RuntimeEnvironment.application

およびnot

RuntimeEnvironment.systemContext

リソースを「手動で」解決しようとしているとき。

それはResources$NotFoundExceptionRobolectricと表示される場合があります。

2
Bartek Lipinski

私はエスプレッソを使用していたため、テストリソースではなくアプリリソースを使用する必要がありました。

代わりに

InstrumentationRegistry.getInstrumentation().context.resources.getString("key")

私は使った

activityRule.activity.getString("key")
1