2013-06-04 10 views
5

Mam problem z Robolectric 2.x (używam 2.1) z projektem Android Maven przy użyciu APKLIB.Robolectric 2.x + Maven na Jenkinsie nie powiodło się z zależnościami APKLIB

To szwy, że Robolectric 2.x oczekuje, że biblioteki Androida będą odwoływać się do pliku project.properties (ten plik jest automatycznie wypełniany przez Intellij lub Eclipse).

Współpracuje przy użyciu Maven na rozwój środowiska, jednak jeśli chcę zbudować mojego projektu Android Maven na serwerze CI (Jenkins) mój build się niepowodzeniem z:

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

Widocznie Robolectric nie może odnaleźć Zależności od bibliotek Androida.

Czy ktoś ma konfigurację działającą z Androidem APKLIB + Jenkins + Maven + Robolectric 2.x?

Odpowiedz

8

Oto, jak sobie z tym poradzimy na Placu ... android-maven-plugin rozpakowuje zależności od APK w target/unpack, a następnie rozszerzamy RobolectricTestRunner, aby je przyciągnąć. Trochę niezgrabne, ale najlepsze, jakie wymyśliliśmy.

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

nie mogą być pewne, że biblioteki nie ma folderu res, co ma konsekwencje, że twój test się nie rozpocznie. Iterowanie poprzez tablicę bibliotek i użycie FileUtils.forceMakeDirs (libs, "res"); rozwiązał problem dla mnie. – thehayro

+0

Nazwa katalogu wygląda teraz na "target/unpacked-libs" zamiast "target/unpack/apklibs" – emmby

0

uruchomić w podobny problem dla Android Studio + Robolectric2.3 + Android Maven-wtyczki projektu 3.9.0-rc.2 która wykorzystuje AppCompat lib (typ URS) powodując:

java.lang.RuntimeException: huh? nie można znaleźć rodzica dla StyleData {name = 'Theme_Custom', rodzic = '@ styl/Theme_AppCompat_Light'

Aby to obsługiwać utworzyć niestandardową testową biegacza:

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); 
     } 
    } 
} 
Powiązane problemy