2013-06-04 34 views
5

我在使用APKLIBs的Android Maven項目中遇到了使用Robolectric 2.x(實際上使用2.1)的問題。Robolectric 2.x + Jenkins上的Maven由於APKLIB的依賴性而失敗

Robolectric 2.x期望Android庫在project.properties中被引用(該文件由Intellij或Eclipse自動填充)。

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

顯然Robolectric找不到:

它在開發環境中使用Maven的時候,但如果我要建立我的構建與失敗的CI服務器(詹金斯)在我的Android Maven項目工作正常Android庫依賴關係。

是否有人使用Android APKLIB + Jenkins + Maven + Robolectric 2.x進行配置?

回答

8

下面是我們如何處理這個問題在廣場... 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); 
    } 
    } 
} 
+0

可能有一些庫,沒有res文件夾,這會導致您的測試無法啓動。遍歷libs數組並使用FileUtils.forceMakeDirs(libs,「res」);爲我解決了這個問題。 – thehayro

+0

目錄名現在看起來是「target/unpacked-libs」而不是「target/unpack/apklibs」 – emmby

0

我碰上了解Android Studio + Robolectric2.3 + Android的Maven的插件3.9.0-rc.2項目,該項目是利用程序兼容性LIB(類型AAR)類似的問題引起:

java.lang.RuntimeException:是吧?找不到父母的 StyleData {名= 'Theme_Custom',父母= '@風格/ 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); 
     } 
    } 
} 
相關問題