【问题标题】:Intent extras in Unit test Android Mockito单元测试 Android Mockito 中的意图附加功能
【发布时间】:2017-09-29 04:06:33
【问题描述】:

我正在尝试验证特定的附加功能是否已添加到 Intent,但我在 Android 单元测试中的 Intent 始终为 null。我有以下需要测试的类:

public class TestClass extends SomeNotifier {
        private Intent mIntent = new Intent("testintent");

        public TestClassConstructor(Context context) {
            super(context);
        }

        @Override
        public void notifyChange() {
            mIntent.putExtra("Key one", 22);
            mIntent.putExtra("Key two", 23);
            mIntent.putExtra("Key three", 24);
            getContext().sendBroadcast(mIntent);
        }
    }

测试如下(我也尝试过 mockIntent,但结果是一样的,extra 再次为空):

@RunWith(MockitoJUnitRunner.class)
public class TestClassTest {

  @Mock
  Context mMockContext;

  @Test
  public void sendBroadcastTest() {

  ArgumentCaptor<Intent> argument = ArgumentCaptor.forClass(Intent.class);

  TestClass testClassNotifier = new TestClass (mMockContext);
  testClassNotifier.notifyChange();
  verify(mMockContext).sendBroadcast(argument.capture());


 Intent intent = argument.getValue();
 //THE INTENT IS NULL
 Assert.assertTrue(intent.hasExtra("Key one"));

    }
}

您有什么建议我应该如何进行这个测试? 提前致谢

【问题讨论】:

    标签: android unit-testing android-intent mockito extras


    【解决方案1】:

    Intent 和其他 Android 运行时类(如 Context)默认情况下仅在物理 Android 手机和模拟器上可用。对于本地单元测试,您将获得运行时的存根版本,其中Intent 等方法将默认返回null。请参阅this question 了解说明。

    这意味着您当前的测试正在针对 Intent 的存根版本进行验证,默认情况下,该版本将为所有方法调用返回 null

    有一些方法可以解决这个问题 - 您可以将测试转换为仪器化的单元测试,这意味着您必须在真正的手机或模拟器上运行它。或者,您可以将 Intent 类包装为您控制的类。

    也许最好的解决方案是使用像Robolectric 这样的框架。这将为您提供重要的 Android 类的工作测试替身(称为影子),例如 Intent,用于在您的 IDE 中运行的本地单元测试。

    仔细安装 Robolectric 后,您只需添加以下内容即可进行测试:

    @RunWith(RobolectricTestrunner.class)
    public class TestClassTest {
    

    顺便说一句,请确保您在 Android 上使用正确的 Mockito 依赖项:

    testCompile 'org.mockito:mockito-core:2.8.9'
    androidTestCompile 'org.mockito:mockito-android:2.8.9'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      相关资源
      最近更新 更多