NullPointerException от LeakCanary при выполнении Robolectric тестов

Добавлен LeakCanary (1.3) в мое приложение:

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

Когда я запускаю набор тестов Robolectric для своего приложения, я получаю исключение NullPointerException в LeakCanary.

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)

Я добавил, что Im использует Crashlytics, чтобы указать, что он (и другие методы также) получает одно и то же приложение, но не генерирует никаких Исключений.

Не уверен, что это должно быть здесь, или по вопросам GitHub для 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 загрузит его вместо вашего приложения. Как вы можете видеть, я подавляю все статические инициализации из вашего приложения.

Подробнее здесь

Ответ 2

Простым способом избежать исключения NullPointerException является отключить LeakCanary для модульных тестов, указав версию release (no-op) в директиве testCompile в build.gradle. Например:

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