我目前对Intent
额外内容感到有些困惑。
我知道所谓的额外内容是Bundle
和Bundle
在内部是地图。
如果我使用intent.putExtra("someName", "someValue");
将一些内容添加到此地图中,我希望现在有一个名为" someName"出现在地图上。但根据我非常简单的单元测试,它不是。
public void testIntent(){
assertTrue("true != true", true);
assertFalse("false != false", false);
final String extraName = "IamAnExtra";
final String extraValue = "IamAValue";
Intent intent = new Intent();
intent.putExtra(extraName, extraValue);
assertTrue("hasExtra==false", intent.hasExtra(extraName));
}
现在结果如下:
junit.framework.AssertionFailedError: hasExtra==false
意图代码背后会发生什么样的魔力? 我知道它通常有效。是否缓存了地图 只有在我发送意图时才会写?提前谢谢!
修改
我添加了行assertNotNull("extras == null", intent.getExtras());
也失败了。
我检查了方法putExtra
和getExtras
中的代码,即:
public Intent putExtra(String name, String value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putString(name, value);
return this;
}
和
public Bundle getExtras() {
return (mExtras != null)
? new Bundle(mExtras)
: null;
}
因此,如果成员mExtras为null,则为getExtras返回null。
但是putExtra会为mExtras
创建一个新的Bundle实例
mExtras
应不为空。我很困惑。
答案 0 :(得分:2)
问题是您尝试使用普通Unit Test
在Android SDK上进行测试。 Android中的单元测试应仅用于app逻辑,使用一些模拟库,如mockito和纯Java代码。
因此,您必须使用Instrumented Test模拟该意图或在真实设备上实施该测试,我强烈建议这样做。
编辑:
条目引用的gradle标志:
testOptions {
unitTests.returnDefaultValues = true
}
只允许在没有任何警告异常的情况下运行测试,但不能使您使用SDK。实际实例化Intent
时,除了空引用之外别无其他。最后,断言intent.hasExtra(...)
不可能是真的。