我对android很新,并试图了解bundle的工作原理。
我被以下单元测试阻止了。有人可以解释一下它失败的原因吗?
@Test
public void testBundle() throws Exception {
Bundle bundle = new Bundle();
String key = "hello";
String value = "world";
bundle.putString(key, value);
Assert.assertEquals(value, bundle.getString(key));
}
junit.framework.ComparisonFailure:
Expected :world
Actual :null
答案 0 :(得分:7)
JUnit测试在本地计算机上运行,该计算机不存在所有Android源代码,只是存根类(描述为here)。这些存根类允许您针对它们编译Android应用程序(因为它们的API与实际的Android框架相同),但是它们不包含任何逻辑以使它们变得轻松#34;。
默认情况下,如果尝试调用任何存根方法,则会出现异常。像这样:
public Bundle() {
throw new RuntimeException("Stub!");
}
这"快速失败"采用的方法是为了防止开发人员意外地针对这些存根类运行他们的代码,然后想知道它为什么不能工作。
但是,可以使用build.gradle
中的此配置更改此行为:
android {
...
testOptions {
unitTests.returnDefaultValues = true
}
}
这使得存根方法返回默认值而不是抛出异常。
您可能已启用此功能,因此当您运行JUnit测试时,您不会获得异常,但Bundle#getString()
方法只返回默认值(null
)。
如果要测试具有Android框架依赖关系的代码,则应执行以下任一操作:
在任何情况下,unitTests.returnDefaultValues = true
都是一个非常危险的功能,因为它会使您的测试不可靠:某些测试可以通过,因为存根方法返回了默认值,但功能将失败真实设备。把它关掉。
答案 1 :(得分:2)
如Building Local Unit Tests中所述,
默认情况下,Gradle的Android插件会执行您的本地设备 测试android.jar库的修改版本 不包含任何实际代码。
您的测试代码针对的Bundle
的剥离版本运行,但不包含实际的实现,因此每当您尝试从中获取内容时,都会获得null
。如果您确实想测试Bundle
的行为,我建议您在Android设备上编写一个针对真实Bundle
实施的测试测试。