android - Robolectric - BuildActivity(MyActivity.class).create() 抛出 NullPointerException

标签 android eclipse unit-testing android-studio robolectric

我在 Android Studio 中有一个在 Eclipse 中创建的项目。我将它迁移到 Gradle 并添加了测试。对于测试,我使用 Robolectric。当我在我的项目中测试库模块时,一切正常,但是当我开始测试应用程序模块并调用 BuilActivity(MyActivity.class).create().get() 控制台时,控制台会打印出错误:

java.lang.NullPointerException
    at org.robolectric.res.builder.DefaultPackageManager.getActivityInfo(DefaultPackageManager.java:173)
    at org.robolectric.util.ActivityController.getActivityInfo(ActivityController.java:65)
    at org.robolectric.util.ActivityController.attach(ActivityController.java:51)
    at org.robolectric.util.ActivityController$1.run(ActivityController.java:121)
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:304)
    at org.robolectric.shadows.CoreShadowsAdapter$2.runPaused(CoreShadowsAdapter.java:45)
    at org.robolectric.util.ActivityController.create(ActivityController.java:118)
    at org.robolectric.util.ActivityController.create(ActivityController.java:129)
    at test(test.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runners.Suite.runChild(Suite.java:128)
    at org.junit.runners.Suite.runChild(Suite.java:27)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

我不知道是什么导致了这个错误。有人有类似的东西吗?

编辑:
在项目中我使用 7 个模块。当我开始测试一个没有 Activite 的模块时,一切正常,但是当我开始测试带有 Activity 的模块时,我得到了上面的错误堆栈跟踪。
Activity
在 Activity 中,附加了带有 viewpager 的 fragment , Activity 开始使用 volley 进行数据下载。这个 Activity 扩展了另一个类,扩展了另一个类,等等......
build.gradle

apply plugin: 'com.android.application'

dependencies {
    compile project(':proj-core')
    compile project(':proj-gui-base')
    testCompile "org.robolectric:robolectric:3.0"
    testCompile "org.robolectric:shadows-support-v4:3.0"
    testCompile 'junit:junit:4.12'
}

android {

    compileSdkVersion 19
    buildToolsVersion "23.0.0"

    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src', 'src/main/java']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        test {
            resources.srcDirs = ['test']
            java.srcDirs = ['test', 'test/src/java']
        }

        robolectric.java.srcDir file('test/src/java')

        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

测试
问题始于@Before 方法

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class Test {

    Context context;
    ShadowApplication shadowApplication;
    HomeActivity homeActivity;

    @Before
    public void setUp() {
        RuntimeEnvironment.application.onCreate();
        context = RuntimeEnvironment.application.getApplicationContext();
        shadowApplication = Shadows.shadowOf(RuntimeEnvironment.application);
        homeActivity = Robolectric.setupActivity(HomeActivity.class);
    }

    @Test
    public void test_core_base_popup_popup() {

        Popup popup = new Popup(Popup.Type.GENERIC);
        PopupQueueManager.addPopup(homeActivity, popup);
        PopupQueueManager.displayAllPopups(homeActivity);
        assertEquals(popup.getContent(), "xyz");
    }
}

项目结构
我只描述了 7 个模块中的一个。每个模块都具有相同的结构。

proj-android  
|  
|-proj-core-base  
    |-assets  
    |-res
    |-src
       |- com.package
    |-test
       |-java
          |-Test.java
|-next-module  
|-next-next-module  
|-etc

最佳答案

我使用的是 Android Studio 3.1.1,在调用 Robolectric.buildActivity(…).create().get() 时也出现了 NullPointerException。然后我找到了以下链接:

http://robolectric.org/getting-started/

建议将以下代码块添加到应用程序的 build.gradle 文件中:

android {
    testOptions {
        unitTests { 
            includeAndroidResources = true 
        } 
    } 
}

通过此添加,避免了异常。我不确定此解决方案是否适用于您的情况。只是分享。

关于android - Robolectric - BuildActivity(MyActivity.class).create() 抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33395385/

相关文章:

ruby-on-rails - 是否有必要对 ActiveRecord 验证进行单元测试?

algorithm - 如何做算法可视化?

java - Admob 中介 - 发布商 ID 与中介 ID

eclipse - 如何从 SVN (Eclipse) 提交中删除文件夹

eclipse - 使用 Eclipse 创建 AVD : Memory Options, 内部存储、SD 卡

java - 表单嵌套 - JSP、HTML

Android 库项目和单元测试

android - 通过 Wi-fi Direct 连接两个设备

android - 何时使用 Activity 或 fragment

ios - Swift - 为什么 Process.arguments 返回空数组