2014-12-01 1 views
3

Я попытался настроить robolectric для работы с моим проектом, составленным с целью Google API, но не могу заставить его работать.Robolectric с API Google - AnnotationFormatError

Я пробовал различные подходы и выделили проблему с помощью deckard-gradle:

Когда я загружаю Декард проект все работает отлично и тестовый образец проходит успешно. Однако, когда я изменить настройки compileSdk в моем Gradle файл в Google Inc.:Google API: 19 Я получаю AnnotationFormatError при выполнении теста:

java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.robolectric.annotation.Config.application() 
    at java.lang.reflect.Method.getDefaultValue(Method.java:747) 
    at sun.reflect.annotation.AnnotationType.<init>(AnnotationType.java:128) 
    at sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:85) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:263) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:117) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70) 
    at java.lang.Class.initAnnotationsIfNecessary(Class.java:3271) 
    at java.lang.Class.getAnnotations(Class.java:3240) 
    at org.junit.runner.Description.createSuiteDescription(Description.java:123) 
    at org.junit.internal.runners.ErrorReportingRunner.getDescription(ErrorReportingRunner.java:25) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:83) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69) 
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:48) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:105) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:355) 
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

Вот некоторые соответствующие фрагменты из моей установки:

сборки .gradle

buildscript { 
     repositories { 
      mavenCentral() 
     } 

     dependencies { 
      classpath 'com.android.tools.build:gradle:0.13.+' 
      classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+' 
     } 
    } 

    allprojects { 
     repositories { 
      mavenCentral() 
     } 
    } 

    apply plugin: 'android' 
    apply plugin: 'robolectric' 

    android { 
     packagingOptions { 
      exclude 'LICENSE.txt' 
      exclude 'META-INF/LICENSE' 
      exclude 'META-INF/LICENSE.txt' 
      exclude 'META-INF/NOTICE' 
     } 
     compileSdkVersion "Google Inc.:Google APIs:19" 
     buildToolsVersion "19.1.0" 

     defaultConfig { 
      minSdkVersion 18 
      targetSdkVersion 18 
      versionCode 2 
      versionName "1.0.0-SNAPSHOT" 
      testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner" 
     } 
     buildTypes { 
      release { 
       runProguard false 
      } 
     } 

     sourceSets { 
      androidTest { 
       setRoot('src/test') 
      } 
     } 
    } 

    robolectric { 
     include '**/*Test.class' 
     exclude '**/espresso/**/*.class' 
    } 

    dependencies { 
     repositories { 
      mavenCentral() 
     } 
     // Espresso 
     androidTestCompile files('lib/espresso-1.1.jar', 'lib/testrunner-1.1.jar', 'lib/testrunner-runtime-1.1.jar') 
     androidTestCompile 'com.google.guava:guava:14.0.1' 
     androidTestCompile 'com.squareup.dagger:dagger:1.1.0' 
     androidTestCompile 'org.hamcrest:hamcrest-integration:1.1' 
     androidTestCompile 'org.hamcrest:hamcrest-core:1.1' 
     androidTestCompile 'org.hamcrest:hamcrest-library:1.1' 

     androidTestCompile('junit:junit:4.11') { 
      exclude module: 'hamcrest-core' 
     } 
     androidTestCompile('org.robolectric:robolectric:2.4') { 
      exclude module: 'classworlds' 
      exclude module: 'commons-logging' 
      exclude module: 'httpclient' 
      exclude module: 'maven-artifact' 
      exclude module: 'maven-artifact-manager' 
      exclude module: 'maven-error-diagnostics' 
      exclude module: 'maven-model' 
      exclude module: 'maven-project' 
      exclude module: 'maven-settings' 
      exclude module: 'plexus-container-default' 
      exclude module: 'plexus-interpolation' 
      exclude module: 'plexus-utils' 
      exclude module: 'wagon-file' 
      exclude module: 'wagon-http-lightweight' 
      exclude module: 'wagon-provider-api' 
     } 
     androidTestCompile 'com.squareup:fest-android:1.0.+' 
    } 

    apply plugin: 'idea' 

    idea { 
     module { 
      testOutputDir = file('build/test-classes/debug') 
     } 
    } 

Мой тест класс:

@Config(manifest = "./src/main/AndroidManifest.xml", emulateSdk = 18) 
@RunWith(RobolectricTestRunner.class) 
public class DeckardActivityRobolectricTest { 

    @Test 
    public void testSomething() throws Exception { 
     Activity activity = Robolectric.buildActivity(DeckardActivity.class).create().get(); 
     assertTrue(activity != null); 
    } 
} 

у меня есть lso следовали инструкциям на robolectric, чтобы установить карты и поддержку lib в мое местное репозиторинг maven.

Любые идеи, что может быть неправильным в моей настройке?

+0

Я не уверен, но, возможно, вам не следует изменять скомпилировать sdk, но добавить дополнительную зависимость 'compile 'com.google.android.gms: play-services: 6.1.71'' –

ответ

0

По различным причинам я отказался от вышеуказанного подхода в пользу сохранения моих тестов Robolectric в подмодуле Gradle. Вы можете найти сообщение в блоге, которое я написал о том, почему я переехал в этом направлении, и вилку проекта «Град-град», которая показывает вам, как here. Поскольку Robolectric поддерживает только SDK версии 18 и ниже, этот проект также имеет модифицированный RobolectricTestRunner, который заставляет его не требовать аннотации для эмуляции более низкой версии SDK.

+0

Спасибо. Я не мог полностью уйти в корень своей проблемы, но я думаю, что это противоречивые зависимости или что-то подобное. Я согласен с вами в том, что использовать субмодуль гораздо менее болезненно. Большое спасибо за вашу вилку, она отлично работает с API Google. Разумеется, в соответствии с моими робоэлектрическими впечатлениями, после решения этой проблемы я столкнулся с несколькими другими проблемами, и в настоящее время я придерживаюсь использования actionbarsherlock и его тем. Но я доберусь до вершины горы в конце концов, даже если они набросят на меня камни;) –

+0

@jdonmoyer Вы проверили, как вы подходите к Android Studio 1.1.0 и добавили поддержку тестирования модулей - http://tools.android. com/tech-docs/unit-testing-support? – bogumil

+0

@bogumil В настоящее время я использую проекты, основанные на примере, который я использую для github с Android Studio 1.1.0, но пока не изучил встроенную поддержку тестирования. Если вы его заработаете, обязательно напишите патч. – jdonmoyer

0

Вопрос для меня состоял в том, что compileSdkVersion в моем файле gradle был установлен в 21, и поскольку Robolectric официально не поддерживает 21 (они делают с версией 3, которая сейчас находится в бета-версии), я изменил ее на 18, и теперь она работает.

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