使用Robolectric来测试具有意图附加功能的服务的启动?

时间:2015-04-23 17:01:15

标签: android testing android-intent robolectric

我可以使用Robolectric测试一个Activity是否启动了一个带有Intent传递的特定Bundle的服务? 答案:是的!

我想编写一个基于Robolectric的测试,用于测试我的MainActivity启动MyService并在目标附加内容中传递特定数字:

在" MainActivity.java"我有方法

public void startMyService() {
  Intent i = new Intent(this, MyService.class);
  Bundle intentExtras = new Bundle();
  // TODO: Put magic number in the bundle
  i.putExtras(intentExtras);
  startService(i);
}

这是我的测试用例" MainActivityTest.java":

import ...

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class MainActivityTest extends TestCase {
  @Override
  protected void setUp() throws Exception {
    super.setUp();
  }

  @Override
  protected void tearDown() throws Exception {
    super.tearDown();
  }

  @Test
  public void testShallPassMagicNumberToMyService() {
    MainActivity activityUnderTest = Robolectric.setupActivity(MainActivity.class);
    activityUnderTest.startMyService();

    Intent receivedIntent = shadowOf(activityUnderTest).getNextStartedService();

    assertNotNull("No intents received by test case!", receivedIntent);

    Bundle intentExtras = receivedIntent.getExtras();
    assertNotNull("No intent extras!", intentExtras);

    long receivedMagicNumber = intentExtras.
            getLong(MyService.INTENT_ARGUMENT_MAGIC_NUMBER);

    assertFalse("Magic number is not included with the intent extras!",
            (receivedMagicNumber == 0L));  // Zero is default if no 'long' was put in the extras
  }
}

所以,我的问题是: 我可以将Robolectric用于此目的吗?

我想我想出来了,请看下面的答案......

测试用例不起作用,因为它报告"没有意图的额外内容!"。使用调试器我注意到Intent.putExtras()在Robolectric环境中没有任何影响。在我的设备上运行应用程序时,i.mExtrasIntent.mExtras)属性已正确设置为Bundle引用。当我运行测试用例时,它是null。我想这暗示我的问题的答案是"没有",所以我应该放弃这个测试用例还是有办法完成这个测试?

修改:更正了示例startMyActivity()方法以反映我实际遇到的问题:除非有一些内容,否则Intent.mExtras属性似乎不会被填充Bundle(?)。这与我使用调试器分析的实时Android环境不同。

1 个答案:

答案 0 :(得分:1)

我对我的示例代码的呈现方式并不完全准确!我已经更新了示例以显示我遇到问题的代码。

事实证明,与真正的Android环境相比,Robolectric环境中的Intent管理方式有所不同。使用Robolectric Intent.mExtras不会被Intent.putExtras()填充,除非Bundle中的某些内容添加到Intent作为附加内容。