Reputation: 1072
I am having an issue using Robolectric 2.x (I am actually using 2.1) with an Android Maven project using APKLIBs.
It seams that Robolectric 2.x expect the Android libraries to be referenced in the project.properties (This file is automatically filled by Intellij or Eclipse).
It works fine when using Maven on developing environment, however If I want build my Android Maven project on a CI server (Jenkins) my build is failing with:
java.lang.RuntimeException: huh? can't find parent for StyleData{name='Theme_Abs_cs', parent='@style/Theme_Sherlock_Light'}
Apparently Robolectric cannot find the Android library dependencies.
Does anyone has a configuration working with Android APKLIB + Jenkins + Maven + Robolectric 2.x?
Upvotes: 5
Views: 1639
Reputation: 6693
I run into similar problem for Android Studio + Robolectric2.3 + android-maven-plugin 3.9.0-rc.2 project which is using AppCompat lib (type aar) causing:
java.lang.RuntimeException: huh? can't find parent for StyleData{name='Theme_Custom', parent='@style/Theme_AppCompat_Light'
To handle this I create custom test runner:
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);
}
}
}
Upvotes: 0
Reputation: 933
Here's how we handle this at Square... android-maven-plugin unpacks your APK dependencies into target/unpack
, then we extend RobolectricTestRunner to pull them in. A little clunky but the best we've come up with.
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);
}
}
}
Upvotes: 8