2015-03-11 4 views
2

Я хочу использовать Unit Tests для моего приложения для Android. Во-первых, я пробовал Unit-Tests с Robolectric с помощью шаблона Project «master-gradle-master». Поскольку это работало нормально, я хотел интегрировать это тестирование в моем существующем приложении Android. Я добавил библиотеки hamcrest-core-1.3.jar, junit-4.12.jar, robolectric-2.4.jar и robolectric-gradle-plugin-1.0.1.jar. Когда я пытаюсь запустить мой TestClass в этом проекте, я всегда получаю следующее исключение:AndroidStudio Robolectric Unit Tests - Invaild default

Exception in thread "main" java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.robolectric.annotation.Config.application() 
at java.lang.reflect.Method.getDefaultValue(Method.java:611) 
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:266) 
at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120) 
at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72) 
at java.lang.Class.createAnnotationData(Class.java:3521) 
at java.lang.Class.annotationData(Class.java:3510) 
at java.lang.Class.getAnnotation(Class.java:3415) 
at com.intellij.junit4.JUnit4TestRunnerUtil.buildRequest(JUnit4TestRunnerUtil.java:199) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:39) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Process finished with exit code 1 

Я действительно не знаю, что делать больше, но я думаю, что что-то не хватает. К сожалению, я не знаю, что.

Это мои Gradle-файлы:

// Top-level build file where you can add configuration options common to all sub-projects/modules. 

    buildscript { 
     repositories { 
      jcenter() 
     } 
     dependencies { 
      classpath 'com.android.tools.build:gradle:1.1.0' 
      classpath 'org.robolectric:robolectric-gradle-plugin:1.0.1' 

      // NOTE: Do not place your application dependencies here; they belong 
      // in the individual module build.gradle files 
     } 
     } 

     allprojects { 
     repositories { 
      jcenter() 
     } 
     } 

и

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

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

    dependencies { 
     compile fileTree(include: ['*.jar'], dir: 'libs') 
     compile 'com.android.support:appcompat-v7:21.0.3' 
     compile files('libs/junit-4.12.jar') 
     compile files('libs/robolectric-2.4.jar') 
     compile files('libs/robolectric-annotations-2.4.jar') 
     compile files('libs/hamcrest-core-1.3.jar') 
     compile files('libs/android.jar') 
     compile files('libs/android-libcore-4.3_r2.robolectric-0.jar') 
     compile files('libs/robolectric-2.4-jar-with-dependencies.jar') 
     compile files('libs/android-support-v4.jar') 
     compile files('libs/maps.jar') 
     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.+') { 
      exclude module: 'hamcrest-core' 
     } 
     androidTestCompile('org.robolectric:robolectric:2.3') { 
      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: 'support-v4' 
      exclude module: 'wagon-file' 
      exclude module: 'wagon-http-lightweight' 
      exclude module: 'wagon-provider-api' 
     } 
     compile files('libs/robolectric-gradle-plugin-1.0.1.jar') 
    } 

Это мой TestClass:

package com.example.bieren.testapplication.test; 

import android.content.Intent; 
import android.os.Bundle; 
import android.widget.Button; 
import android.widget.TextView; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.Robolectric; 
import org.robolectric.RobolectricTestRunner; 
import org.robolectric.annotation.Config; 

import static org.hamcrest.core.IsEqual.equalTo; 
import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertThat; 
import static org.junit.Assert.assertTrue; 

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

    private MainActivity activity; 

    @Test 
    public void testIcon() throws Exception { 
     String play_icon = new MainActivity().getResources().getString(R.string.icon_play); 
     assertThat(play_icon, equalTo("&#xf144;")); 
    } 
    @Before 
    public void setup(){ 
     this.activity = Robolectric.buildActivity(MainActivity.class).create().get(); 
    } 
    @Test 
    public void buttonClickShouldSetText() throws Exception 
    { 
     Button button = (Button) activity.findViewById(R.id.button); 
     TextView textView = (TextView) activity.findViewById(R.id.nachricht); 
     textView.setText("Hans Hans"); 
     button.performClick(); 

     assertEquals(textView.getText(),"Hans Hans"); 
    } 

} 

Я действительно была бы более чем благодарен, если кто-то может сказать мне, В чем проблема и чего не хватает.

Тимон

+0

Вы решили это? –

+0

Да. Изменение @Config на '@Config (manifest =" app/src/main/AndroidManifest.xml ", emulateSdk = 18, reportSdk = 18)' решил проблему для меня. – unknown

+1

Можете ли вы отправить ответ, чтобы на это можно было ответить? –

ответ

1

Изменение @Config до @Config(manifest = "app/src/main/AndroidManifest.xml", emulateSdk = 18, reportSdk = 18) решена проблема для меня.

0

Если вы используете новую среду для тестирования, настройки Robolectric более гладко. Посмотрите на это link, чтобы настроить проект в новой тестовой среде.

Как раз в этом случае вам нужно будет обновить Android Studio до версии 1.1 RC1 или выше для этого.

Этот подход позволяет избежать использования любого типа плагина для Robolectric.

0

Удаление папки .gradle работает для меня каждый раз!