2014-12-01 4 views
3

robolectric을 설정하여 Google API 타겟에 대해 컴파일 된 프로젝트에서 작동 시키려고했으나 제대로 작동하지 않습니다.Google API가있는 Robolectric - AnnotationFormatError

나는 다양한 접근을 시도하고 deckard-gradle를 사용하여 문제를 격리했다 :

내가 데커드 프로젝트 모든 것이 잘 작동하고 샘플 테스트가 성공적으로 실행 다운로드합니다. 내가 구글 Inc.:Google API에 내 Gradle을 파일에 compileSdk 설정을 변경 그러나 때

빌드 : 여기

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) 

내 설정에서 몇 가지 관련 조각입니다 : 19 테스트를 실행할 때 나는이 사용해 AnnotationFormatError를 얻을 수

@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); 
    } 
} 

나는 F도 있습니다

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') 
     } 
    } 

내 테스트 클래스는 .gradle robolectric에 대한 지침을 따라 내지도 및 지원 lib를 내 로컬 메이븐 레포에 설치하십시오.

내 설정에 어떤 문제가있을 수 있습니까?

+0

확실하지 않지만 어쩌면 당신은 sdk 컴파일을 변경하지 말고 추가로 종속성을 추가하십시오. com.google.android.gms : play-services : 6.1.71'' –

답변

0

여러 가지 이유로, 나는 Robodlectric 테스트를 Gradle 서브 모듈로 유지하기 위해 위의 방법을 포기했습니다. 내가 왜이 방향으로 이사했는지에 대한 블로그 게시물과 deckard-gradle 프로젝트의 포크를 찾을 수 있습니다. here. Robolectric은 SDK 버전 18 이하 만 지원하기 때문에이 프로젝트는 주석이 더 낮은 SDK 버전을 에뮬레이션하지 않고도이를 강제하는 수정 된 RobolectricTestRunner를 가지고 있습니다.

+0

고마워요. 나는 내 문제의 근원을 알 수는 없었지만, 그것은 상반되는 의존성이나 비슷한 것이라고 생각한다. 나는 당신에게 서브 모듈을 사용하는 것이 훨씬 덜 고통 스럽다는 것에 동의한다. Deckard 포크에 대해 고마워, Google API와 잘 작동합니다. 물론 내 robolectric 경험에 맞춰서 나는이 문제를 해결 한 후에 몇 가지 다른 문제를 발견했다. 그리고 나는 현재 actionbarsherlock과 그것의 테마를 사용하고있다. 하지만 나는 결국 바위 꼭대기에 올라갈 것이다.) –

+0

@jdonmoyer 당신이 Android Studio 1.1.0에 접근하고 단위 테스팅 지원을 추가했는지 확인 했습니까? http://tools.android. co.kr/tech-docs/unit-testing-support? – bogumil

+0

@bogumil 현재 Android Studio 1.1.0에서 github을 사용하는 예제를 기반으로하는 프로젝트를 사용하고 있지만 아직 유닛 테스트 지원 기능에 대해서는 조사하지 않았습니다. 제대로 작동한다면 확실히 패치를 제출하십시오. – jdonmoyer

0

내게있어서 그 문제는 내 그라디언 파일에 compileSdkVersion이 21로 설정되어 있었고 Robolectric이 21을 공식적으로 지원하지 않았기 때문에 (현재 베타 버전 3을 사용하고 있습니다) 18로 변경했는데 지금은 작동합니다.