我可以使用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.mExtras
(Intent.mExtras
)属性已正确设置为Bundle引用。当我运行测试用例时,它是null
。我想这暗示我的问题的答案是"没有",所以我应该放弃这个测试用例还是有办法完成这个测试?
修改:更正了示例startMyActivity()
方法以反映我实际遇到的问题:除非有一些内容,否则Intent.mExtras
属性似乎不会被填充Bundle
(?)。这与我使用调试器分析的实时Android环境不同。
答案 0 :(得分:1)
我对我的示例代码的呈现方式并不完全准确!我已经更新了示例以显示我遇到问题的代码。
事实证明,与真正的Android环境相比,Robolectric环境中的Intent管理方式有所不同。使用Robolectric Intent.mExtras
不会被Intent.putExtras()
填充,除非Bundle
中的某些内容添加到Intent
作为附加内容。