2015-04-03 2 views
1

все мои действия по проекту наследуются от CustomActivity, которая является внешней библиотекой, которую я создал, чтобы помочь мне с обычными вещами.Robolectric NoClassDefFoundError с внешней библиотекой

Проблема заключается в том, когда я пытаюсь проверить эту деятельность с 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' 
} 

EDIT, Добавление дополнительной информации:

Моя 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 версия плагина вы используете? –

+0

Можете ли вы поделиться своим тестовым классом? –

+0

Просто добавила дополнительную информацию, спасибо. – Gilson

ответ

-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, и ошибка продолжается, любая другая ошибка? – Gilson

+0

Я сделал то, что вы сказали, и теперь он не может найти файл манифеста, и я получаю эту ошибку: .FileNotFoundException (AndroidManifest) и Robolectric не поддерживают уровень API 1 – Gilson

+0

Похоже, что у вас нет специальных символов в пути dir, поэтому я изменено, и теперь я только получил эту ошибку: Ресурсы $ NotFoundException ShadowAssetManager.getAndResolve Любая идея? Это все еще о моей пользовательской acitivity androidcore.activity.CustomActivity.onCreate (CustomActivity.java:19) – Gilson

Смежные вопросы