簡體   English   中英

Robolectric NoClassDefFoundError與外部庫

[英]Robolectric NoClassDefFoundError with external library

我所有的項目活動都從CustomActivity繼承而來,CustomActivity是我創建的一個外部庫,可以幫助我進行常見用法。

問題是,當我嘗試使用robolectric測試該活動時,出現以下錯誤:

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

有任何想法嗎? 我應該陰影嗎? 我應該在一些Robolectric Config中添加參考嗎?

這是我的應用程序構建文件:

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

提前致謝

基本問題是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);
}

有關一些示例,請訪問:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM