在 Bazel 中设置 Robolectric

Setting up Robolectric in Bazel

我在为 Bazel 构建系统设置 Robolectric 时遇到了一些问题,主要是因为它需要的依赖项数量。

似乎没有一个包含 Robolectric 及其所有依赖项的 JAR。因此,我都试过了:

  1. 使用自定义 BUILD 文件在我的 WORKSPACE 文件中创建一个 new_git_repository 规则,该文件编译来自 Robolectric repo 的 Java 源代码。

  2. Downloading all JARs for Robolectric’s dependencies,然后将它们捆绑在我的测试规则可以依赖的 java_import 中。

在第一种情况下,我 运行 遇到了尝试从提供的 Groovy 类 生成 Java 代码的问题,并且仍然必须手动包含其他几个依赖项。在第二种情况下,我遇到了 Robolectric 的 MavenDependencyResolver 在 运行 时无法找到某些依赖项的问题,这导致不得不手动包含缺少的依赖项 JAR文件。

无论如何,让 Bazel 编译和 运行 Robolectric 测试似乎有点麻烦。在 Bazel 构建系统中使用 Robolectric 有更好的方法吗?

对此进行了另一次尝试,我下载 Robolectric 依赖项的所有 JAR 的方法对我有用。我最初缺少的部分是让 Robolectric 知道它应该在本地而不是通过 Maven 查找其依赖项的 jvm 标志。我按照 blog post zlalanne 建议的步骤下载所有 JAR,将它们移动到我的项目可以访问的目录中,然后为这些创建构建目标:

java_import(
  name = "robolectric",
  jars = glob([
      "*.jar",
  ]),
  visibility = [
      "//visibility:public",
  ],
)

然后我创建了一个新规则,它将为标准 java_test 规则提供正确的 Robolectric 依赖项和 jvm 标志:

def android_robolectric_test(name, deps=[], srcs=[], test_class="", visibility=None):
  androidPlatform = [Label('@androidsdk//:platforms/android-25/android.jar')]
  robolectricDeps = androidPlatform + [Label(“//path/to/robolectric:robolectric")]

  native.java_test(
    name=name,
    srcs=srcs,
    deps=robolectricDeps + deps,
    test_class=test_class,
    jvm_flags=[
      "-Drobolectric.offline=true",
      "-Drobolectric.dependency.dir=‘path/to/robolectric/’”,
    ],
    visibility=visibility,
  )

现在可用 android_local_test rule