5

APKLIB を使用する Android Maven プロジェクトで Robolectric 2.x (実際には 2.1 を使用しています) を使用すると問題が発生します。

Robolectric 2.x は、Android ライブラリが project.properties で参照されることを期待しているようです (このファイルは、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 に答える