如何创建一个新的Bundle对象?

时间:2016-07-29 16:28:30

标签: java android firebase firebase-analytics

我正在尝试将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 =在包中点击
  预期:点击
  实际:null

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

请耐心等待我,因为我正在发现Android环境的具体细节。

2 个答案:

答案 0 :(得分:4)

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

这是我原始简化测试用例的更新版本:

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的相应函数来设置。代码并不像眼睛那么容易,但它应该让我获得想要的行为。

答案 1 :(得分:-1)

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