2016-06-16 193 views
2

我目前有点困惑Intent演员。 我知道所谓的临时演员是BundleBundle 在内部是一张地图。简单的意图 - jUnit测试失败

如果我在这张地图上放了一些东西,用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。 但putExtra将为mExtras创建一个新的Bundle实例,因此 mExtras应该不为空。我很困惑。

+0

您是将它作为_unit test_还是_instrumented test_运行?你在用什么框架,JUnit 4? – josemigallas

+0

单元测试。我使用了一个正常的TestCase。 – JacksOnF1re

+0

我认为使用普通的Intent可以和好的老单元一起使用,不是吗?我不会尝试发送它或其他东西。 – JacksOnF1re

回答

1

问题是,您正在尝试使用正常的Unit Test在Android SDK上进行测试。 Android中的单元测试应该只用于应用程序逻辑,使用一些模拟库,如mockito和纯Java代码。

因此,您必须嘲笑该意图或在使用Instrumented Test的真实设备上执行该测试,我强烈建议您选择该选项。

您有explanation why here

编辑:

这该条目是指gradle这个标志:

testOptions { 
     unitTests.returnDefaultValues = true 
    } 

只允许测试中没有任何警告的异常运行,但不会让你能够使用SDK。当你真正实例化那个Intent时,你除了空引用外别无其他。最后,断言intent.hasExtra(...)不是真的。

+0

谢谢你,我会阅读每一个参考资料,明天自己测试,然后接受答案。 – JacksOnF1re