Выполнение теста Gradle с Robolectric и AppCompat приводит к NullPointerException

Как следует из названия, запуск тестов Robolectric с помощью Gradle приводит к NullPointerException при вызове Robolectric.buildActivity(MyActivity.class).create().get();

build.gradle (на основе этого ответа)

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

repositories {
    mavenCentral()
    maven {
        url 'https://oss.sonatype.org/content/repositories/snapshots/'
    }
}

apply plugin: 'android'

android {
    compileSdkVersion 18
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}

sourceSets {
    testLocal {
        java.srcDir file('src/test/java')
        resources.srcDir file('src/test/resources')
    }
}

dependencies {
    compile 'com.android.support:support-v4:18.0.0'
    compile 'com.android.support:appcompat-v7:18.0.+'
    compile project(':Libraries:ViewPagerIndicator')

    testLocalCompile project(':Libraries:appcompat')
    testLocalCompile 'junit:junit:4.8.2'
    testLocalCompile 'org.robolectric:robolectric:2.1'
    testLocalCompile 'com.google.android:android:4.1.1.4'
    testLocalCompile 'com.google.android:support-v4:r6'
    testLocalCompile 'org.roboguice:roboguice:2.0'
}

task localTest(type: Test, dependsOn: assemble) {
    testClassesDir = sourceSets.testLocal.output.classesDir

    android.sourceSets.main.java.srcDirs.each { dir ->
        def buildDir = dir.getAbsolutePath().split('/')
        buildDir =  (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')

        sourceSets.testLocal.compileClasspath += files(buildDir)
        sourceSets.testLocal.runtimeClasspath += files(buildDir)
    }

    classpath = sourceSets.testLocal.runtimeClasspath
}

check.dependsOn localTest

MyActivityTest.java

@RunWith(RobolectricTestRunner.class)
@Config(manifest=Config.NONE)
public class MyActivityTest {

    MyActivity activity;


    @Before
    public void setUp() {
        activity = Robolectric.buildActivity(MyActivity.class).create().get();
    }

    @Test
    public void testSomeNumber() {
        Assert.assertEquals(true,true);
    }
}

MyActivity.java расширяет BaseActivity, который расширяет ActionBarActivity.

Запуск этой конфигурации из командной строки с вызовом ./gradlew localTest приводит к следующему исключению

Трассировка стека

java.lang.NullPointerException
    at org.robolectric.res.builder.RobolectricPackageManager.getActivityInfo(RobolectricPackageManager.java:62)
    at android.support.v7.app.ActionBarActivityDelegate.getUiOptionsFromMetadata(ActionBarActivityDelegate.java:157)
    at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:53)
    at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98)
    at com.example.activity.BaseActivity.onCreate(BaseActivity.java:17)
    at com.example.activity.MyActivity.onCreate(MyActivity.java:27)
    at android.app.Activity.performCreate(Activity.java:5008)
    at org.fest.reflect.method.Invoker.invoke(Invoker.java:112)
    at org.robolectric.util.ActivityController$1.run(ActivityController.java:119)
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:256)
    at org.robolectric.util.ActivityController.create(ActivityController.java:114)
    at org.robolectric.util.ActivityController.create(ActivityController.java:126)
    at com.example.test.MyActivityTest.setUp(MyActivityTest.java:35)

Есть идеи?


person dng    schedule 22.08.2013    source источник
comment
похоже проблема в MyActivity   -  person Selvin    schedule 22.08.2013
comment
да вроде так. но строка просто вызывает super.onCreate(savedInstanceState); то же самое для BaseActivity, и я ничего не вызываю до этого.   -  person dng    schedule 22.08.2013
comment
Я не уверен, но из документации Config.NONE, если ваш класс не использует ресурсы или проект не имеет манифеста. Но оба случая не для теста активности   -  person Eugen Martynov    schedule 27.08.2013
comment
В своей аннотации @Config вы пытались использовать reportSdk = 10?   -  person Marco RS    schedule 14.11.2013


Ответы (1)


Попробуйте изменить скрипт сборки. Приведенный ниже файл gradle автоматически запускает robolectric test при выполнении задачи сборки. Вы можете отредактировать это по своему желанию.

В текущей версии android-test-plugin есть проблема, поэтому мы должны использовать версию моментального снимка. Подробнее: gradle-android-test-plugin

Путь тестов по умолчанию

источник/тест/java/...

buildscript {
   repositories {
     mavenCentral()
     maven {
        url 'https://oss.sonatype.org/content/repositories/snapshots/'
     }
  }
  dependencies {
     classpath 'com.android.tools.build:gradle:0.6.+'
     classpath 'com.squareup.gradle:gradle-android-test-plugin:0.9.1-SNAPSHOT'

  }
}
apply plugin: 'android'
apply plugin: 'android-test'

repositories {
mavenCentral()
}

android {
compileSdkVersion 19
buildToolsVersion "19.0.0"

 defaultConfig {
    minSdkVersion 8
    targetSdkVersion 19       
 }
}

dependencies {
  compile 'com.android.support:appcompat-v7:+'   
  testCompile 'junit:junit:4.10'
  testCompile 'org.robolectric:robolectric:2.1.+'
  testCompile 'com.squareup:fest-android:1.0.+'
}
person Milina Udara    schedule 27.12.2013