如何创建一个新的 Bundle 对象?
How to create a new Bundle object?
我正在尝试将 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: Did not find eventType=click in bundle
Expected :click
Actual :null
有人知道问题出在哪里吗?也就是说,如何从零创建一个 Bundle 对象并正确填充它,以便我可以在这样的单元测试中使用它?
请多多包涵,因为我正在了解 Android 环境的具体情况。
尝试使用 .equals()
比较字符串,因为 assertEquals()
也使用 .equal()
方法进行工作。
正如 Tanis.7x 在对我的原始问题的评论中指出的那样,所有 Android 框架 类 都需要被嘲笑为 [=用于 运行 单元测试的 20=] 为空,如记录 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 的适当函数进行设置。代码看起来不那么容易,但它应该能让我获得想要的行为。
我正在尝试将 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: Did not find eventType=click in bundle
Expected :click
Actual :null
有人知道问题出在哪里吗?也就是说,如何从零创建一个 Bundle 对象并正确填充它,以便我可以在这样的单元测试中使用它?
请多多包涵,因为我正在了解 Android 环境的具体情况。
尝试使用 .equals()
比较字符串,因为 assertEquals()
也使用 .equal()
方法进行工作。
正如 Tanis.7x 在对我的原始问题的评论中指出的那样,所有 Android 框架 类 都需要被嘲笑为 [=用于 运行 单元测试的 20=] 为空,如记录 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 的适当函数进行设置。代码看起来不那么容易,但它应该能让我获得想要的行为。