gpt4 book ai didi

resources - 膨胀 View 时,Robolectric 使用库中不正确的资源 ID

转载 作者:行者123 更新时间:2023-12-04 04:54:03 25 4
gpt4 key购买 nike

这不完全是一个问题,因为我找到了问题的解决方案。只是希望它能帮助其他遇到它的人。

我们使用 Robolectric 为使用库(实际上是几个库)的项目编写单元测试。库和应用程序使用了大量资源。

让我们假设 Eclipse 工作区包含项目库(以“library.package”作为顶级包),它创建了一个使用库的 Android 库和项目应用程序(与“app.package”在顶部)。项目 Test 是指应用项目的 Robolectric 项目。

突然间,我们发现用于检查事件中特定 View 是否存在的非常简单的测试失败了。例如:

@Test
public void testProgressBarInit() {
LoginActivity activity = Robolectric.buildActivity(LoginActivity.class).create().get();

assertTrue(activity.findViewById(R.id.status_text) instanceof TextView);

}

库项目实现了 LoginActivity 并定义了适当的资源(布局)。在我们稍微更改代码结构以消除更多库之前,失败的测试可以完美运行。

在调试器下运行测试表明 findViewById 调用使​​用了从 Application/gen/R.java 文件中获取的 R.id.status_text 的正确值。同时我们发现Application/gen/R.java中R.id.status文本的值与Library/gen/R.java中的值不同。此外,Appication/gen 目录包含文件 library.package.R.java,其中包含与 Application/gen/R.java 中相同的 status_text 值(与 Library/gen/R.java 中的原始值不同)。这是 aapt 工具的正常行为,它可以在合并库和应用程序中的资源时更改资源 ID。

最佳答案

经过一些调查,我们发现了以下几点:

  • Robolectric 加载在库中定义的资源 ID 两次:一次使用应用程序项目中的 R.class,另一个使用库项目中的 R.class
  • 加载哪个类取决于类路径配置
  • 要运行测试,我们需要从应用程序项目中导出库项目
  • 如果库项目在类路径配置中的 Application/gen 文件夹之前导出,Robolectric 将资源 ID 替换为 Library/bin/classes/library/package/R.class
  • 中的资源 ID。
  • 如果库项目在 Application/gen 文件夹之后导出,Robolectric 使用在 Application/bin/library/package/R.class 中找到的正确资源。

  • 这当然是 Robolectric 实现中的一个错误,因为它不应该从与库包关联的 R.class 加载资源 ID。所有 id 都传播到 Application/gen/R.java(参见 discussion here on GitHub)。

    如果您在使用 Robolectric 时遇到这种或类似的资源使用问题,请确保在 Build Path-Order 和 Export 配置中的 Application/gen 文件夹之后导出库项目。

    关于resources - 膨胀 View 时,Robolectric 使用库中不正确的资源 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17035519/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com