我使用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进行配置?
答案 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);
}
}
}