【问题标题】:Robolectric: Resources$NotFoundException: String resource ID with Android Gradle Plugin 3Robolectric:Resources$NotFoundException:带有 Android Gradle 插件 3 的字符串资源 ID
【发布时间】:2017-08-28 15:53:16
【问题描述】:
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$

非常感谢您的任何建议。

【问题讨论】:

  • 从命令行和 gradle 运行时是否看到同样的错误?
  • 如果我在 Android Studio 2.3.3 中打开项目并使用 gradle 版本 2.3.3 并设置 jackOptions { enabled true } 和 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
  • jack 已弃用。如果你不在build.gradle文件中做修改,你能从命令行成功运行它吗?
  • 我已恢复到 AS 3.0。我已经在命令行./gradlew test 上运行了测试,我遇到了和以前一样的问题NotFoundException

标签: android unit-testing testing android-testing robolectric


【解决方案1】:

不是对这个问题的直接回答,但是如果您正在测试需要上下文来查询资源的东西,我发现以下方法可以很好地工作:

ApplicationProvider.getApplicationContext()

(或 RuntimeEnvironment.application -- 但不推荐使用以上内容)

【讨论】:

    【解决方案2】:

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

    android {
      testOptions {
        unitTests.includeAndroidResources true
      }
    }
    

    【讨论】:

      【解决方案3】:

      As mentioned 来自 Google 团队的工程师(很可能是 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
      

      【讨论】:

      • 谢谢,看来android.enableAapt2=false 可以解决问题。
      • 这可行,但禁用此选项:android.enableAapt2=false 会导致其他错误。现在我们必须为字符串资源添加一个参数。也许有更好的解决方案?
      • android.enableAapt2=false 现已弃用
      【解决方案4】:

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


      一定要使用

      RuntimeEnvironment.application
      

      并且不是

      RuntimeEnvironment.systemContext
      

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

      这是Resources$NotFoundException 可能与Robolectric 一起出现的一种情况。

      【讨论】:

        【解决方案5】:

        我使用的是 espresso,为此您需要使用应用资源,而不是测试资源。

        所以不是

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

        我用过

        activityRule.activity.getString("key")
        

        【讨论】:

          【解决方案6】:

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

          官方指南Android Studio 3.0 Release

          【讨论】:

            【解决方案7】:

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

            运行您的测试。

            “使用 Android Studio 构建”下的更多信息。”

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 2023-03-25
                • 2013-06-27
                • 2021-05-09
                • 2012-06-26
                • 2019-08-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多