简单的意图 - jUnit测试失败

时间:2016-06-16 11:17:49

标签: java android android-intent junit

我目前对Intent额外内容感到有些困惑。 我知道所谓的额外内容是BundleBundle 在内部是地图。

如果我使用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());也失败了。

我检查了方法putExtragetExtras中的代码,即:

    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 不为空。我很困惑。

1 个答案:

答案 0 :(得分:2)

问题是您尝试使用普通Unit Test在Android SDK上进行测试。 Android中的单元测试应仅用于app逻辑,使用一些模拟库,如mockito和纯Java代码。

因此,您必须使用Instrumented Test模拟该意图或在真实设备上实施该测试,我强烈建议这样做。

您拥有explanation why here

编辑:

条目引用的gradle标志:

    testOptions { 
        unitTests.returnDefaultValues = true
    }

只允许在没有任何警告异常的情况下运行测试,但不能使您使用SDK。实际实例化Intent时,除了空引用之外别无其他。最后,断言intent.hasExtra(...)不可能是真的。