android snackbar - 如何用roboelectric测试

时间:2015-10-29 18:26:06

标签: android robolectric android-snackbar

here我们现在知道robolectric没有阴影对象但是我们可以为小吃吧创建一个自定义阴影对象。他们有一个用于烤面包但不用于零食吧。

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

它有点硬,因为小吃店不是xml。因此,当我声明我的实际活动控制器时,它当时没有小吃吧。

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

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

2 个答案:

答案 0 :(得分:3)

它在博客中实际解释了如何添加ShadowToast类以启用测试。

  1. 将ShadowSnackbar添加到测试源;
  2. 在自定义Gradle测试运行器中添加Snackbar类作为检测类;
  3. 在测试中将ShadowSnackbar添加为阴影;
  4. 在您应用的代码中,当没有可用的互联网连接时,您将在Snackbar上呼叫。由于Snackbar作为Instrumented类的配置(例如拦截),将使用该类的Shadow-variant。您将能够在那一刻评估结果。

答案 1 :(得分:2)

我发布了很多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
}