【问题标题】:NullPointerException from LeakCanary when running Robolectric tests运行 Robolectric 测试时来自 LeakCanary 的 NullPointerException
【发布时间】:2015-05-11 13:59:22
【问题描述】:

在我的应用程序中添加了 LeakCanary (1.3):

@Override
public void onCreate() {
    super.onCreate();
    Fabric.with(this, new Crashlytics());
    LeakCanary.install(this);

当我为我的应用程序运行 Robolectric 测试套件时,我在 LeakCanary 中收到 NullPointerException。

Caused by: java.lang.NullPointerException
at com.squareup.leakcanary.LeakCanary.isInServiceProcess(LeakCanary.java:165)
at com.squareup.leakcanary.LeakCanary.isInAnalyzerProcess(LeakCanary.java:141)
at com.squareup.leakcanary.LeakCanary.install(LeakCanary.java:52)
at com.squareup.leakcanary.LeakCanary.install(LeakCanary.java:43)
at com.package.application.MyApplication.onCreate(MyApplication.java:50)
at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:131)
at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:431)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:224)

我补充说,我使用 Crashlytics 来指出它(以及其他方法)接收相同的应用程序但不抛出任何异常。

不确定这是否应该在此处或 LeakCanary 的 GitHub 问题上。还有其他人遇到这个问题吗?

【问题讨论】:

  • 看一下 LeakCanary.java 的源码,执行测试时好像 HeapAnalyzerService 没有运行。
  • 在测试中覆盖您的应用程序并抑制 Crashlitics 和 LeakCanary 初始化。更多信息在这里 (robolectric.org/custom-test-runner)
  • 谢谢!我选择了自定义应用程序类选项。

标签: robolectric leakcanary


【解决方案1】:

将我的评论转化为答案。

Robolectric 提供了通过测试应用程序处理不同初始化和应用程序测试生命周期的方法。

这是您的应用程序类:

public class <YourAppplication> extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fabric.with(this, new Crashlytics());
        LeakCanary.install(this);
    }
}

您应该将测试源放入与您的应用程序下一个类相同的包中:

public class Test<YourAppplication> extends <YourApplication> {
    @Override
    public void onCreate() {
    }
}

Robolectric 将加载它而不是您的应用程序。如您所见,我禁止从您的应用程序中进行所有静态初始化。

您可以找到更多详情here

【讨论】:

    【解决方案2】:

    避免 NullPointerException 的一种简单方法是通过在 build.gradle 的 testCompile 指令中指定发布(无操作)版本来禁用 LeakCanary 进行单元测试。例如:

    dependencies {
        ...
        testCompile (
            'junit:junit:4.12',
            'org.robolectric:robolectric:3.0',
            'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
        )
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多