2015-04-28 76 views
2

我想用以下設置測試一個android庫。 com.android.tools.build:gradle:1.2.0, org.robolectric:robolectric:3.0-rc2, android studio 1.2-rc-3 在我的測試設置中,我正在對另一個庫的R文件進行間接引用。測試運行良好從android工作室內,但從命令行運行產生以下錯誤。

java.lang.NoClassDefFoundError: robolectricdemo/com/baselibrary/R$color 
      at robolectricdemo.com.baselibrary.DemoStaticClass.getDemoResource(DemoStaticClass.java:12) 
      at LibraryResourceTest.setUp(LibraryResourceTest.java:25) 

      Caused by: 
      java.lang.ClassNotFoundException: robolectricdemo.com.baselibrary.R$color 
       at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
       at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
       at java.security.AccessController.doPrivileged(Native Method) 
       at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
       at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
       at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
       at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
       at org.robolectric.internal.bytecode.InstrumentingClassLoader.loadClass(InstrumentingClassLoader.java:98) 
       ... 2 more 

我在http://github.com/tcw48/robolectricDemo創造了我的代碼的簡化版本,具有重要的片段波紋管。

測試類生活在庫extendlibrary

RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class) 
public class LibraryResourceTest { 
    private int color; 

    @Before 
    public void setUp() { 
     color = DemoStaticClass.getDemoResource(RuntimeEnvironment.application); 
    } 

    @Test 
    public void testLibraryResource(){ 
     assertNotNull(color); 
    } 
} 

這個靜態類生活在庫baselibrary。

public class DemoStaticClass { 

    public static int getDemoResource(Context context) { 
     return context.getResources().getColor(R.color.robo_red); 
    } 
} 

我注意到在只正在包extendlibrary產生的R文件生成目錄,但沒有包baselibrary。在名爲baselibrary的包中手動創建R文件會導致測試通過。關於我可能做錯什麼的想法。

+0

在任何人通過你的代碼之前,什麼版本的Robolectric?爲什麼不在這裏使用他們的示例,那工作:https://github.com/robolectric/robolectric-samples?爲什麼你沒有發佈任何代碼片段?應用程序運行正常嗎? –

+0

將添加請求的信息。我不使用這些樣本,因爲它們不適用於我試圖測試的內容。 – TravisW

+0

你需要什麼確切的測試? –

回答

0

R類缺失,直到您提供一個;)當您將有效的R類複製到預期的程序包時,嘗試它是否也適用於您。

您必須在副本任務時更改路徑,以匹配您的包名

afterEvaluate { project -> 
    android.libraryVariants.each { variant -> 
    // workaround for missing R class for aar dependencies 
    tasks.getByName("assemble${variant.name.capitalize()}").dependsOn copyAppcompat 

    // workaround for missing compilation of main sources 
    tasks.getByName("test${variant.name.capitalize()}") { 
     dependsOn "assemble${variant.name.capitalize()}" 
    } 
    } 
} 

task copyAppcompat(type: Copy) { 
    from 'build/generated/source/r/debug/com/example/core' 
    into 'src/test/java/android/support/v7/appcompat' 
    include 'R.java' 
    filter { line -> line.contains('package com.example.core;') ? 'package android.support.v7.appcompat;' : line } 
} 

下面是一個例子項目依賴於其他庫(AAR)https://github.com/nenick/AndroidStudioAndRobolectric/blob/library-with-aar

而且這裏的例子build.gradlehttps://github.com/nenick/AndroidStudioAndRobolectric/blob/library-with-aar/core/build.gradle#L42

+0

是的,我最終在這方面做了一些事情,但有點失望,robolectric無法從盒子裏拿出來。 – TravisW

+0

由於應用程序模塊在取決於庫時不喜歡附加的R類,因此我將目標更改爲'src/test/java/android/support/v7/appcompat''。 – nenick