AssertJ Android

一套用于测试 Android 的 AssertJ 断言。

编写测试并非开发 Android 应用中最光鲜亮丽的部分,但却价值非凡。使用 JUnit 和 AssertJ 等库为编写测试提供了绝佳的起点。

这个库是 AssertJ 的扩展,旨在让测试 Android 变得更加简单。

AssertJ Android
assertThat(view).isGone();
常规 JUnit
assertEquals(View.GONE, view.getVisibility());
常规 AssertJ
assertThat(view.getVisibility()).isEqualTo(View.GONE);

当断言失败时,AssertJ Android 断言会产生一个输出,让你能立即识别问题:Expected visibility <gone> but was <invisible>.

将其与常规 AssertJ 的输出 expected:<[8]> but was:<[4]> 和常规 JUnit 的输出 expected: <8> but was: <4> 进行比较,你就能立刻看到其优势。

因为 AssertJ Android 直接对对象而非属性提供断言,所以它们可以链式调用。

AssertJ Android
assertThat(layout).isVisible()
    .isVertical()
    .hasChildCount(4)
    .hasShowDividers(SHOW_DIVIDERS_MIDDLE);
常规 JUnit
assertEquals(View.VISIBLE, layout.getVisibility());
assertEquals(VERTICAL, layout.getOrientation());
assertEquals(4, layout.getChildCount());
assertEquals(SHOW_DIVIDERS_MIDDLE, layout.getShowDividers());
常规 AssertJ
assertThat(layout.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(layout.getOrientation()).isEqualTo(VERTICAL);
assertThat(layout.getChildCount()).isEqualTo(4);
assertThat(layout.getShowDividers()).isEqualTo(SHOW_DIVIDERS_MIDDLE);

几乎所有你可能想测试的对象都有对应的断言,从 LinearLayoutActionBarFragment 再到 MenuItem。支持库中的所有内容也都包含在内。

要开始编写测试,请添加以下导入

import static org.assertj.android.api.Assertions.assertThat;
附加模块

还为附加的 Android 库提供了模块。添加依赖(如下所示)并使用以下导入

  • support-v4

    import static org.assertj.android.support.v4.api.Assertions.assertThat;
  • Google Play Services

    import static org.assertj.android.playservices.api.Assertions.assertThat;
  • appcompat-v7

    import static org.assertj.android.appcompat.v7.api.Assertions.assertThat;
  • mediarouter-v7

    import static org.assertj.android.mediarouter.v7.api.Assertions.assertThat;
  • gridlayout-v7

    import static org.assertj.android.gridlayout.v7.api.Assertions.assertThat;
  • cardview-v7

    import static org.assertj.android.cardview.v7.api.Assertions.assertThat;
  • recyclerview-v7

    import static org.assertj.android.recyclerview.v4.api.Assertions.assertThat;
  • pallete-v7

    import static org.assertj.android.pallete.v4.api.Assertions.assertThat;
扩展

提供的断言也被设计为可以扩展,以用于你开发的任何自定义控件。

public class CustomLayout extends LinearLayout {
  public int getBehavior() {
    /* ... */
  }
}

使用以下模式设置你的断言。

public class CustomLayoutAssert extends AbstractLinearLayoutAssert<CustomLayoutAssert, CustomLayout> {
  public static CustomLayoutAssert assertThat(CustomLayout actual) {
    return new CustomLayoutAssert(actual);
  }

  public CustomLayoutAssert(CustomLayout actual) {
    super(actual, CustomLayoutAssert.class);
  }

  public CustomLayoutAssert hasSomeBehavior() {
    isNotNull();
    assertThat(actual.getBehavior())
        .overridingErrorMessage("Expected some behavior but was doing other behavior.")
        .isEqualTo(42)
    return this;
  }
}

现在在你的测试类中静态导入 CustomLayoutAssert.assertThat

有关编写自定义断言的更多信息,请参阅官方文档

下载
  • Android 模块

    androidTestCompile 'com.squareup.assertj:assertj-android:1.0.0'
  • support-v4 模块

    androidTestCompile 'com.squareup.assertj:assertj-android-support-v4:1.0.0'
  • Google Play Services 模块

    androidTestCompile 'com.squareup.assertj:assertj-android-play-services:1.0.0'
  • appcompat-v7 模块

    androidTestCompile 'com.squareup.assertj:assertj-android-appcompat-v7:1.0.0'
  • mediarouter-v7 模块

    androidTestCompile 'com.squareup.assertj:assertj-android-mediarouter-v7:1.0.0'
  • gridlayout-v7 模块

    androidTestCompile 'com.squareup.assertj:assertj-android-gridlayout-v7:1.0.0'
  • cardview-v7 模块

    androidTestCompile 'com.squareup.assertj:assertj-android-cardview-v7:1.0.0'
  • recyclerview-v7 模块

    androidTestCompile 'com.squareup.assertj:assertj-android-recyclerview-v7:1.0.0'
  • pallete-v7 模块

    androidTestCompile 'com.squareup.assertj:assertj-android-pallete-v7:1.0.0'
Fork me on GitHub

by Square, Inc.