Robolectric:Resources $ NotFoundException:使用Android Gradle Plugin 3的字符串资源ID

问题描述 投票:39回答:7
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$

非常感谢任何建议。

android unit-testing testing android-testing robolectric
7个回答
62
投票

来自Google团队的工程师As mentioned(很可能是Xavier Ducrohet),Robolectric与AAPT2有问题:

Robolectric与aapt2不兼容。

这里有两个选择。

第一种选择 - 遵循Robolectric guidelines for Android Studio 3.0+

将以下内容添加到build.gradle:

android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

使用Robolectric测试运行器注释您的测试:

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

第二个选项:禁用AAPT2将以下行添加到gradle.properties文件中:

android.enableAapt2=false

6
投票

Robolectric documentation声明以下配置应与Android Studio 3.x一起使用:

android {
  testOptions {
    unitTests.includeAndroidResources true
  }
}

2
投票

如果您的构建由于AAPT2资源处理问题而失败,或者您想使用Roboelectric,则可以通过在AAPT2文件中设置android.enableAapt2=false并通过从命令行运行gradle.properties重新启动Gradle守护程序来禁用./gradlew --stop

官方指南Android Studio 3.0 Release


1
投票

(对于任何可能正在寻找解决类似问题的人)


一定要用

RuntimeEnvironment.application

并不是:

RuntimeEnvironment.systemContext

当您尝试“手动”解决资源时。

这是Resources$NotFoundException可能出现在Robolectric的一个案例。


1
投票

我正在使用浓缩咖啡,为此您需要使用应用资源,而不是测试资源。

而不是

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

我用了

activityRule.activity.getString("key")

-2
投票

在我的情况下,以下问题解决了我的问题:“问题与android studio有关。转到'运行' - >'编辑配置...'并将'工作目录'值更改为$ MODULE_DIR $

运行测试。

更多信息请参阅“使用Android Studio构建”。“

参考:https://github.com/robolectric/robolectric/issues/2653


-2
投票

您也可以尝试@Config(manifest = "<projectFolder>/src/main/AndroidManifest.xml"),因为您不能简单地包含资源,因为某些项目测试将失败并包含。

© www.soinside.com 2019 - 2024. All rights reserved.