【问题标题】:How to create a new Bundle object?如何创建一个新的 Bundle 对象?
【发布时间】:2016-07-29 16:28:30
【问题描述】:

我正在尝试将 Firebase Analytics 用于 Android 应用程序,为了记录事件,我关注了 https://firebase.google.com/docs/analytics/android/events。也就是说,为了发送我的事件,我必须创建一个新的 Bundle 对象(我使用默认构造函数创建)并调用 Firebase Analytics 的 logEvent 函数。在使用简单的单元测试测试我的开发时,我意识到捆绑包中没有设置任何内容,这让我怀疑是否发送了任何信息。顺便说一句,它也破坏了我的测试用例。

这是一个显示我的问题的简化测试用例:

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=click in bundle
预期:点击
实际:null

有人知道问题出在哪里吗?也就是说,如何从零开始创建一个 Bundle 对象并正确填充它,以便可以在这样的单元测试中使用它?

请耐心等待,因为我正在探索 Android 环境的细节。

【问题讨论】:

  • 默认情况下,您不能在单元测试中使用Bundle 或任何其他 Android 框架类,因为用于运行单元测试的 android.jar 不包含任何代码。运行这些测试时,您应该会收到 RuntimeException。您是否使用任何类型的模拟框架来规避这种情况?
  • 是的,在完整的测试用例中,我使用 Mockito 来模拟 Application 和 PowerMockito 来模拟 FirebaseAnalytics 实例。话虽如此,我仍然遇到与上面简化的测试用例相同的行为,其中不包含任何模拟工具。在 Android Studio 中运行我的测试时,我没有看到任何异常,因为 android.jar 在我的类路径中。我还需要模拟Bundle 类吗?如果是,为什么以及如何?
  • 是的,你也需要模拟 Bundle,这是这里的主要问题。
  • 感谢您的帮助@Tanis.7x。我在下面添加了一个答案;如果这不是您想到的方法,请告诉我。

标签: java android firebase firebase-analytics


【解决方案1】:

正如 Tanis.7x 在对我的原始问题的评论中指出的那样,所有 Android 框架类都需要被模拟,因为用于运行单元测试的 android.jar 是空的,如记录的here .

这是我最初的简化测试用例的更新版本:

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"));
    }
}

主要区别在于,我之前使用简单 getter 设置的变量现在是使用 Mockito 的适当函数设置的。代码看起来不那么容易,但它应该可以让我获得想要的行为。

【讨论】:

    【解决方案2】:

    尝试使用.equals() 比较字符串,因为assertEquals() 也使用.equal() 方法来工作。

    【讨论】:

    • 从我的问题的答案可以看出,手头的问题显然不是assertEquals()的使用,而是如何正确使用Android框架类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多