2013-08-22 8 views
5

jak tytuł mówi uruchamiania testów Robolectric z Gradle skutkuje NullPointerException podczas wywoływania Robolectric.buildActivity(MyActivity.class).create().get();Uruchamianie testu Gradle z Robolectric i AppCompat skutkuje NullPointerException

build.gradle (w oparciu o this answer)

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 rozszerza BaseActivity która rozciąga ActionBarActivity

Uruchamianie tej konfiguracji z linii poleceń nazywając ./gradlew localTest wyniki w następujący wyjątek

StackTrace

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) 

pomysłów?

+0

Wygląda problem jest w MyActivity – Selvin

+0

Tak, wydaje się, że. ale linia po prostu wywołuje 'super.onCreate (savedInstanceState);' samo dla BaseActivity i nie wywołuję niczego wcześniej. – dng

+1

Nie jestem pewien, ale z dokumentacji 'Config.NONE', jeśli klasa nie używa zasobów lub projekt nie ma manifestu. Ale oba przypadki nie dotyczą testu aktywności. –

Odpowiedz

0

Spróbuj zmienić skrypt budowy. Poniżej pliku gradle automatycznie uruchomi się test robolektryczny po uruchomieniu zadania kompilacji. Możesz edytować to, jak chcesz.

W aktualnym wydaniu dodatku testowego do androida jest problem, więc musimy użyć wersji migawki. Więcej szczegółów: gradle-android-test-plugin

Domyślna ścieżka z testów

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.+' 
} 
Powiązane problemy