Как создать новый объект Bundle?

65
2

Я пытаюсь использовать Firebase Analytics для приложения для Android, и для регистрации событий я следил за https://firebase.google.com/docs/analytics/android/events. То есть, чтобы отправить мое событие, мне нужно создать новый объект Bundle (который я создаю с помощью конструктора по умолчанию), и я вызываю функцию logEvent для Firebase Analytics. При тестировании моей разработки с помощью простого unit test я понял, что в комплекте нет содержимого, что заставляет меня задаться вопросом, отправлена ​​ли какая-либо информация вообще. Кстати, это также ломает мой тестовый пример.


Здесь приведен упрощенный пример, который показывает мою проблему:


import android.os.Bundle;
import org.junit.Test;

import static junit.framework.Assert.assertEquals;

public class SimpleTest {

@Test
public void test() {
Bundle params = new Bundle();
params.putString("eventType", "click");
params.putLong("eventId",new Long(5542));
params.putLong("quantity", new Long(5));
params.putString("currency", "USD");

assertEquals("Did not find eventType=click in bundle", "click", params.getString("eventType"));
}
}


Этот тестовый пример не соответствует следующему сообщению:


junit.framework.ComparisonFailure: Не найдено eventType = щелкните в пакете
Ожидаемое: нажмите кнопку Фактическое значение: null



Кто-нибудь знает, где проблема? То есть, как мне создать объект Bundle с нуля и правильно заполнить его, чтобы я мог использовать его в unit test следующим образом?


Прошу вас поучаствовать в этом, поскольку я обнаруживаю особенности среды Android, когда мы говорим.

спросил(а) 2020-04-04T01:36:05+03:00 3 месяца назад
1
Решение
89

Как указано в Tanis.7x в комментарии к моему первоначальному вопросу, все классы фреймворка Android нужно издеваться над тем, как android.jar, используемый для запуска модульных тестов, пуст, как документировано здесь.


Здесь обновленная версия моего первоначального упрощенного тестового примера:

import android.os.Bundle;

import org.junit.Test;
import org.mockito.Mockito;

import static junit.framework.Assert.assertEquals;

public class SimpleTest {

@Test
public void test() {
Bundle bundleMock = Mockito.mock(Bundle.class);
Mockito.doReturn("click").when(bundleMock).getString("eventType");
Mockito.doReturn(new Long(5542)).when(bundleMock).getLong("eventId");
Mockito.doReturn(new Long(5)).when(bundleMock).getLong("quantity");
Mockito.doReturn("USD").when(bundleMock).getString("currency");

assertEquals("Did not find eventType=click in bundle", "click", bundleMock.getString("eventType"));
}
}


Основное отличие состоит в том, что переменные, заданные ранее с помощью простых геттеров, теперь устанавливаются с помощью соответствующих функций Mockito. Код не так прост в глазах, но он должен позволить мне получить желаемое поведение.

ответил(а) 2020-04-04T01:54:34.266129+03:00 3 месяца назад
-4

Попробуйте использовать .equals() для сравнения строк, поскольку assertEquals() также использует метод .equal() для своей работы.

ответил(а) 2020-04-04T01:36:05+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема