我有一个启动 IntentService
的 BroadcastReceiver
:
@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
失败了:
知道为什么我有 2 个不同的对象吗?
编辑 argumentIntent.capture()
中捕获的Intent
包含一个ParamsRequest
对象,但所有字段在这个对象中是 null
。
最佳答案
这是关于序列化的。
当您将 ParamsRequest
放入 Intent
时,在引擎盖下,ParamsRequest
中的所有字段都被转换为字符串、 bool 值、整数等所以他们可以存储。稍后当您从 Intent
检索 ParamsRequest
时,所有这些值都会被收集并创建一个新的 ParamsRequest
。因此,初始的 ParamsRequest
和第二个 ParamsRequest
是不同的对象,然后您会得到断言错误。
您在这里要做的是比较每个字段或 ParamsRequest
或覆盖 ParamsRequest
的 equals
。
关于android - BroadcastReceiver 向 IntentService 发送 Intent 时单元测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53497100/