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'
)
...
}