用Robolectric编写Android单元测试

使用assertJ-android断言库

为什么使用断言库?

Junit的Assert类自带很多的断言方法,比如常用的有:

  • assertEquals()
  • assertNotNull()
  • assertTrue()
  • assertFalse()

那我们为什么还要使用第三方的断言库呢?

我们来看一个场景,假设你的应用在网络断开时会显示一个View来提示用户“网络不可用,请连接网络。”

那么我们来测试这个View有没有显示,如果使用Junit断言是这样:

assertEquals(View.GONE, view.getVisibility());

而使用assertJ是这样:

assertThat(view).isGone();

首先从代码简洁和可读性来说,assertJ就胜了一筹。然后最关键的是,当你的测试失败时,Junit会提示:

Expected: <8> but was: <4>

而assertJ的提示是:

Expected visibility <gone> but was <invisible>

相信你已经明白assertJ的妙处了。

而且assertJ还支持链式api:

assertThat(layout).isVisible()
    .isVertical()
    .hasChildCount(4)
    .hasShowDividers(SHOW_DIVIDERS_MIDDLE);

更多api请查看:

包括org.assertj.core.api.Assertions.assertThatorg.assertj.android.api.Assertions.assertThat