Изпълнението на 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 тест, когато изпълните задача за изграждане. Можете да редактирате това, както желаете.

Има проблем в текущата версия на android-test-plugin, така че трябва да използваме версия за моментна снимка. Повече подробности: gradle-android-test-plugin

Пътят по подразбиране на тестовете е

src/test/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