android snackbar - 如何使用 robolectric 进行测试

android snackbar - how to test with roboelectric

here 我们现在知道 robolectric 没有影子对象但是我们可以为 snackbar.It 创建一个自定义影子对象很遗憾他们有一个用于吐司但是不适用于小吃店。

当没有网络连接时,我在我的代码中显示了一个 snackbar。我想知道如何编写一个单元测试(使用 robolectric 作为测试运行程序)来验证在没有网络连接时是否显示小吃店。

有点难,因为小吃店不在xml。因此,当我声明我的实际 Activity 控制器时,它当时没有小吃店。

你知道如何测试我们有的吐司ShadowToast.getTextOfLatestToast()我想要一个用于小吃吧

我目前正在使用 org.robolectric:robolectric:3.0-rc2 并且看不到 ShadowSnackbar.class 可用。

实际上在博文中解释了如何添加 ShadowToast class 以启用测试。

  1. 将 ShadowSnackbar 添加到您的测试源;
  2. 在您的自定义 Gradle 测试运行器中添加 Snackbar class 作为工具 class;
  3. 在您的测试中将 ShadowSnackbar 添加为影子;

在您的应用程序代码中,您将在没有可用互联网连接时调用 Snackbar。由于将 Snackbar 配置(例如拦截)为 Instrumented class,将使用 class 的 Shadow-variant。届时您将能够评估结果。

我发了很多simpler answer

你可以这样做:

val textView: TextView? = rootView.findSnackbarTextView()
assertThat(textView, `is`(notNullValue()))

实施:

/**
 * @return a TextView if a snackbar is shown anywhere in the view hierarchy.
 *
 * NOTE: calling Snackbar.make() does not create a snackbar. Only calling #show() will create it.
 *
 * If the textView is not-null you can check its text.
 */
fun View.findSnackbarTextView(): TextView? {
  val possibleSnackbarContentLayout = findSnackbarLayout()?.getChildAt(0) as? SnackbarContentLayout
  return possibleSnackbarContentLayout
      ?.getChildAt(0) as? TextView
}

private fun View.findSnackbarLayout(): Snackbar.SnackbarLayout? {
  when (this) {
    is Snackbar.SnackbarLayout -> return this
    !is ViewGroup -> return null
  }
  // otherwise traverse the children

  // the compiler needs an explicit assert that `this` is an instance of ViewGroup
  this as ViewGroup

  (0 until childCount).forEach { i ->
    val possibleSnackbarLayout = getChildAt(i).findSnackbarLayout()
    if (possibleSnackbarLayout != null) return possibleSnackbarLayout
  }
  return null
}