Подтвердить что ты не робот

Ошибка Robolectric и Google Analytics при тестировании

Я работал с Robolectric, и все было отлично. Затем я применил Google Analytics к своему классу приложений, и тесты начали сбой. Провал, кажется, происходит, когда я раздуваю взгляды во время тестов. Здесь трассировка стека:

java.lang.NullPointerException: null
at com.google.analytics.tracking.android.AnalyticsGmsCoreClient$AnalyticsServiceConnection.onServiceConnected(AnalyticsGmsCoreClient.java:176)
at org.robolectric.shadows.ShadowApplication$2.run(ShadowApplication.java:209)
at org.robolectric.util.Scheduler$PostedRunnable.run(Scheduler.java:162)
at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:107)
at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:92)
at org.robolectric.util.Scheduler.advanceToLastPostedRunnable(Scheduler.java:68)
at org.robolectric.util.Scheduler.unPause(Scheduler.java:25)
at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:219)
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:258)
at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:32)
at android.view.ViewGroup.addView(ViewGroup.java)
at android.view.ViewGroup.addView(ViewGroup.java:3225)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:750)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at org.robolectric.shadows.ShadowView.inflate(ShadowView.java:82)
at android.view.View.inflate(View.java)

Здесь приведен код Robolectric для моей BaseActivity:

@RunWith(RobolectricTestRunner.class)
public class BaseActivityTest {

ActivityController<TestActivity> activityController;
TestActivity activity;

@Before
public void setUp(){
    activityController = Robolectric.buildActivity(TestActivity.class).create().start();
}


@After
public void takeDown(){
    activityController.stop().destroy();
    activity = null;
}

@Test
public void testOnPauseState(){
    activity = activityController.resume().pause().get();
    assertFalse(activity.getBus().isActive());
}
}

Следуя примеру Google Analytics, мой класс приложений реализует Google Analytics. Всякий раз, когда я запускаю тесты с помощью моего приложения, происходит разрыв. Я попытался реализовать объект Robolectric MockApplication, но это не изменилось; Мне пришлось удалить Google Analytics из моего объекта приложения, чтобы он работал. Есть ли у кого-нибудь решения, которые позволили бы мне запустить Robolectric с помощью Google Analytics?

4b9b3361

Ответ 1

У меня есть два предложения для вас, если вы используете Google Analytics V3:

1) Пробовали ли вы использовать этот метод при запуске тестов?

 googleAnalytics.setAppOptOut(true); 

Это отключит аналитику google для срока службы теста.

2) Создайте тестовый класс приложения в том же пакете, что и ваше текущее приложение, и назовите его тем же именем, но добавьте "Test" к имени. Это приложение будет создано во время ваших тестов, и вы можете установить значение "setAppOptOut" равным true, или вы можете вообще отказаться от GoogleAnalytics.

Дополнительную информацию можно найти здесь: http://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html

Ответ 2

Существует другое решение, если предыдущие сообщения не работают. Возьмите дескриптор теневого приложения и настройте его, чтобы игнорировать привязку намерения к запуску аналитики. Сделайте это в своей тестовой настройке.

@Before
public void setup() {
    ShadowApplication shadowApplication = Robolectric.shadowOf(Robolectric.application);
    shadowApplication.declareActionUnbindable("com.google.android.gms.analytics.service.START");
}

Ответ 3

Я пробовал все вышеупомянутые решения, и никто из них не работал у меня. Наконец, это произошло:

public class TestFooApplication extends FooApplication {
    @Override
    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
        return false;
    }
}