运行Robolectric测试时LeakCanary的NullPointerException

时间:2015-05-11 13:59:22

标签: robolectric leakcanary

将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问题上。有其他人遇到过这个问题吗?

2 个答案:

答案 0 :(得分:15)

将我的评论转换为答案。

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

答案 1 :(得分:0)

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

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