5

我在使用 Robolectric 2.x(我实际上使用的是 2.1)和使用 APKLIB 的 Android Maven 项目时遇到问题。

它接缝 Robolectric 2.x 期望在 project.properties 中引用 Android 库(该文件由 Intellij 或 Eclipse 自动填充)。

在开发环境中使用 Maven 时它工作正常,但是如果我想在 CI 服务器 (Jenkins) 上构建我的 Android Maven 项目,我的构建将失败:

java.lang.RuntimeException: huh? can't find parent for StyleData{name='Theme_Abs_cs', parent='@style/Theme_Sherlock_Light'}

显然 Robolectric 找不到 Android 库依赖项。

有没有人有使用 Android APKLIB + Jenkins + Maven + Robolectric 2.x 的配置?

4

2 回答 2

8

以下是我们在 Square 处理此问题的方法... android-maven-plugin将您的 APK 依赖target/unpack项解压到 .,然后我们扩展 RobolectricTestRunner 以将它们拉入。有点笨重,但我们想出了最好的。

public class SquareTestRunner extends RobolectricTestRunner {
  private static boolean alreadyRegisteredAbs = false;

  public SquareTestRunner(Class<?> testClass) throws InitializationError {
    super(testClass);
  }

  @Override protected AndroidManifest createAppManifest(File baseDir) {
    return new MavenAndroidManifest(Fs.newFile(new File(".")));
  }

  public static class MavenAndroidManifest extends AndroidManifest {
    public MavenAndroidManifest(FsFile baseDir) {
      super(baseDir);
    }

    @Override protected List<FsFile> findLibraries() {
      // Try unpack folder from maven.
      FsFile unpack = getBaseDir().join("target/unpack/apklibs");
      if (unpack.exists()) {
        FsFile[] libs = unpack.listFiles();
        if (libs != null) {
          return asList(libs);
        }
      }
      return emptyList();
    }

    @Override protected AndroidManifest createLibraryAndroidManifest(FsFile libraryBaseDir) {
      return new MavenAndroidManifest(libraryBaseDir);
    }
  }
}
于 2013-06-05T02:04:08.347 回答
0

对于使用 AppCompat lib(aar 类型)的 Android Studio + Robolectric2.3 + android-maven-plugin 3.9.0-rc.2 项目,我遇到了类似的问题,导致:

java.lang.RuntimeException:嗯?找不到 StyleData{name='Theme_Custom', parent='@style/Theme_AppCompat_Light' 的父级

为了解决这个问题,我创建了自定义测试运行器:

public class MyTestRunner extends RobolectricTestRunner {
    private static boolean alreadyRegisteredAbs = false;

    public MyTestRunner(Class<?> testClass) throws InitializationError {
        super(testClass);
    }

    @Override
    protected AndroidManifest createAppManifest(FsFile manifestFile, FsFile resDir, FsFile assetsDir) {
        return new MavenAndroidManifest( manifestFile,  resDir,  assetsDir);
    }

    public static class MavenAndroidManifest extends AndroidManifest {
        public MavenAndroidManifest(FsFile androidManifestFile, FsFile resDirectory, FsFile assetsDirectory) {
            super(androidManifestFile, resDirectory, assetsDirectory);
        }

        public MavenAndroidManifest(FsFile libraryBaseDir) {
            super(libraryBaseDir);
        }

        @Override
        protected List<FsFile> findLibraries() {
            // Try unpack folder from maven.
            FsFile unpack = getBaseDir().join("target/unpacked-libs");
            if (unpack.exists()) {
                FsFile[] libs = unpack.listFiles();
                if (libs != null) {
                    return Arrays.asList(libs);
                }
            }
            return Collections.emptyList();
        }

        @Override
        protected AndroidManifest createLibraryAndroidManifest(FsFile libraryBaseDir) {
            return new MavenAndroidManifest(libraryBaseDir);
        }
    }
}
于 2014-07-10T09:35:01.173 回答