2015-04-03 81 views
1

我的所有項目活動都繼承自一個CustomActivity,它是我創建的一個外部庫,用於幫助我處理常見的用法。Robolectric NoClassDefFoundError與外部庫

問題是,當我嘗試測試與robolectric該活動我得到這個錯誤:

java.lang.NoClassDefFoundError: br/com/androidcore/activity/CustomActivity 

任何想法?我應該影子嗎?我應該參考一些Robolectric配置嗎?

這裏是我的應用程序生成的文件:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "br.com.boozeprice" 
     minSdkVersion 14 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    defaultConfig { 
     testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner" 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile 'com.android.support:support-v4:21.0.3' 

    compile project(':androidcore') 
    compile project(':persistencecore') 

    testCompile 'junit:junit:4.12' 
    testCompile 'org.robolectric:robolectric:2.4' 
} 

編輯,添加額外的信息:

我gradle這個版本:

dependencies { 
    classpath 'com.android.tools.build:gradle:1.1.3' 
    // NOTE: Do not place your application dependencies here; they belong 
    // in the individual module build.gradle files 
} 

我的測試:

@RunWith(CustomRobolectricRunner.class) 
public class IntegrationTest { 
    @Test 
    public void testActivity() { 
     Activity activity = Robolectric.setupActivity(MainActivity.class); 
     TextView txt = (TextView) activity.findViewById(R.id.txtMain); 
     String result = txt.getText().toString(); 
     assertThat(result, equalTo("Test")); 
    } 
} 

我CustomRunner:

public class CustomRobolectricRunner extends RobolectricTestRunner { 
    public CustomRobolectricRunner(Class<?> testClass) 
      throws InitializationError { 
     super(testClass); 
    } 

    @Override 
    protected AndroidManifest getAppManifest(Config config) { 
     String path = "src/main/AndroidManifest.xml"; 

     // android studio has a different execution root for tests than pure gradle 
     // so we avoid here manual effort to get them running inside android studio 
     if (!new File(path).exists()) { 
      path = "app/" + path; 
     } 

     config = overwriteConfig(config, "manifest", path); 
     return super.getAppManifest(config); 
    } 

    protected Config.Implementation overwriteConfig(
      Config config, String key, String value) { 
     Properties properties = new Properties(); 
     properties.setProperty(key, value); 
     return new Config.Implementation(config, 
       Config.Implementation.fromProperties(properties)); 
    } 

    @Override 
    protected SdkConfig pickSdkVersion(
      AndroidManifest appManifest, Config config) { 
     // current Robolectric supports not the latest android SDK version 
     // so we must downgrade to simulate the latest supported version. 
     config = overwriteConfig(config, "emulateSdk", "18"); 
     return super.pickSdkVersion(appManifest, config); 
    } 
} 

我的主要活動:

public class MainActivity extends CustomActivity 

自定義活動:

public abstract class CustomActivity extends Activity 

在此先感謝

+0

什麼安卓gradle這個插件版本您使用? – 2015-04-03 07:30:13

+0

你能分享你的測試課嗎? – 2015-04-03 07:30:44

+0

剛剛添加了額外的信息,謝謝。 – Gilson 2015-04-03 15:20:56

回答

-1

基礎的問題是,robolectric不知道你在圖書館的資源。但是,這可以固定...

選項1:更新robolectric到3.0-RC2

刪除您定製的運行。有一類新的RobolectricGradleTestRunner其解決資源裝載於庫依賴

選項2:從RobolectricGradleTestRunner

使用的解決方法從您的自定義robolectric亞軍刪除所有代碼,並添加

public CustomRobolectricRunner(Class<?> testClass) throws InitializationError { 
    super(testClass); 
    String buildVariant = (BuildConfig.FLAVOR.isEmpty() ? "" : BuildConfig.FLAVOR+ "/") + BuildConfig.BUILD_TYPE; 
    String intermediatesPath = getClass().getResource("").toString().replace("file:", ""); 
    System.out.println(intermediatesPath); 
    intermediatesPath = intermediatesPath.substring(0, intermediatesPath.indexOf("/classes")); 

    System.setProperty("android.package", BuildConfig.APPLICATION_ID); 
    System.setProperty("android.manifest", intermediatesPath + "/manifests/full/" + buildVariant + "/AndroidManifest.xml"); 
    System.setProperty("android.resources", intermediatesPath + "/res/" + buildVariant); 
    System.setProperty("android.assets", intermediatesPath + "/assets/" + buildVariant); 
} 

對於一些例子請訪問:

+1

我已經更新到robolectric 3.0-RC2和錯誤仍然存​​在,任何其他sugestion? – Gilson 2015-04-07 23:50:15

+0

我做了你所說的,現在它無法找到清單文件,我得到這個錯誤:.FileNotFoundException(AndroidManifest)和Robolectric不支持API級別1 – Gilson 2015-04-08 00:12:54

+0

看來,你不能在目錄路徑上有特殊字符,所以我已經改變,現在我只有這個錯誤: Resources $ NotFoundException ShadowAssetManager.getAndResolve 任何想法?它仍然是我的自定義acitivty androidcore.activity.CustomActivity.onCreate(CustomActivity.java:19) – Gilson 2015-04-08 00:16:59