Jenkins上的Robolectric 2.x + Maven因APKLIB依赖而失败

时间:2013-06-04 00:11:33

标签: android maven jenkins robolectric

我使用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进行配置?

2 个答案:

答案 0 :(得分: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);
    }
  }
}

答案 1 :(得分:0)

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

  

java.lang.RuntimeException:呵呵?无法找到父母   StyleData {name =&#39; Theme_Custom&#39;,parent =&#39; @ style / Theme_AppCompat_Light&#39;

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

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);
        }
    }
}