Android Bundle简单单元测试不起作用

Hui*_*ang 7 android

我对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
Run Code Online (Sandbox Code Playgroud)

Vas*_*liy 7

JUnit测试在没有所有Android源代码的本地机器上运行,但只是存根类(在此处描述).这些存根类允许您针对它们编译Android应用程序(因为它们的API与实际的Android框架相同),但它们不包含任何逻辑以使它们"轻松".

默认情况下,如果尝试调用任何存根方法,则会出现异常.像这样的东西:

public Bundle() {
    throw new RuntimeException("Stub!");
}
Run Code Online (Sandbox Code Playgroud)

采用这种"快速失败"方法是为了防止开发人员意外地针对这些存根类运行代码,然后想知道为什么它不起作用.

但是,可以使用以下配置更改此行为build.gradle:

android {
  ...
  testOptions {
    unitTests.returnDefaultValues = true
  }
}
Run Code Online (Sandbox Code Playgroud)

这使得存根方法返回默认值而不是抛出异常.

您可能已启用此功能,因此当您运行JUnit测试时,您不会获得异常,但Bundle#getString()方法只返回默认值(即null).

如果要测试具有Android框架依赖性的代码,则应执行以下任一操作:

  1. 模拟这些依赖(例如Mockito)
  2. 用Robolectric运行测试
  3. 在Android设备上运行检测测试

在任何情况下,使用unitTests.returnDefaultValues = true都是一个非常危险的功能,因为它会使您的测试不可靠:某些测试可以通过,因为存根方法返回了默认值,但功能将在真实设备上失败.把它关掉.