android - BroadcastReceiver 向 IntentService 发送 Intent 时单元测试失败

标签 android unit-testing broadcastreceiver intentservice

我有一个启动 IntentServiceBroadcastReceiver:

@Override
public void onReceive(Context context, Intent intent) {

    ParamsRequest paramsRequest = new ParamsRequest.Builder()
            .setUrl(intent.getStringExtra("url"))
            .build();

    Intent serviceIntent = new Intent(context, MyIntentService.class);
    serviceIntent.putExtra("paramsKey", paramsRequest);
    context.startService(serviceIntent);
}

并且 MyIntentService 检索 Intent(使用对象 paramsRequest):

@Override
protected void onHandleIntent(Intent intent) {

    ParamsRequest paramsRequest = (ParamsRequest) intent.getSerializableExtra("paramsKey");

    //more code
}

我有一个测试来确保正确发送和检索 Intent :

@Test
public void testStartAndroidProofService() {
    Intent intent = new Intent(context, AndroidProofService.class);
    intent.putExtra("paramsKey", paramsRequest);

    receiver.onReceive(context, intent);
    assertNull(receiver.getResultData());

    ArgumentCaptor<Intent> argumentIntent = ArgumentCaptor.forClass(Intent.class);
    Mockito.verify(context, times(1)).startService(argumentIntent.capture());
    assertEquals(paramsRequest, argumentIntent.getValue().getSerializableExtra("paramsKey"));
}

但是 AssertEquals 失败了:

enter image description here

知道为什么我有 2 个不同的对象吗?

编辑 argumentIntent.capture() 中捕获的Intent 包含一个ParamsRequest 对象,但所有字段在这个对象中是 null

最佳答案

这是关于序列化的。

当您将 ParamsRequest 放入 Intent 时,在引擎盖下,ParamsRequest 中的所有字段都被转换为字符串、 bool 值、整数等所以他们可以存储。稍后当您从 Intent 检索 ParamsRequest 时,所有这些值都会被收集并创建一个新的 ParamsRequest。因此,初始的 ParamsRequest 和第二个 ParamsRequest 是不同的对象,然后您会得到断言错误。

您在这里要做的是比较每个字段或 ParamsRequest 或覆盖 ParamsRequestequals

关于android - BroadcastReceiver 向 IntentService 发送 Intent 时单元测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53497100/

相关文章:

java - 无法接收来自服务的广播

Android - 滚动或平移谷歌地图等网站时刷新 WebView

java - Android - CircularImageView setImageDrawable 以编程方式创建可绘制对象

android - android studio 3.3 中没有 ActionBar 也没有 StatusBar

unit-testing - 构建 rspec 模块的推荐方法?

java - 没有模拟的单元测试包保护类

java - 我想在启动后从另一个服务调用服务方法,但我不知道如何创建该服务的对象

Android: AlarmManager on BroadcastReceiver 的生命周期

android - 使用 url 创建微调器时 R.java 出错

oop - 与依赖项隔离的单元测试值对象