编写测试并非开发 Android 应用中最光鲜亮丽的部分,但却价值非凡。使用 JUnit 和 AssertJ 等库为编写测试提供了绝佳的起点。
这个库是 AssertJ 的扩展,旨在让测试 Android 变得更加简单。
assertThat(view).isGone();
assertEquals(View.GONE, view.getVisibility());
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 直接对对象而非属性提供断言,所以它们可以链式调用。
assertThat(layout).isVisible() .isVertical() .hasChildCount(4) .hasShowDividers(SHOW_DIVIDERS_MIDDLE);
assertEquals(View.VISIBLE, layout.getVisibility()); assertEquals(VERTICAL, layout.getOrientation()); assertEquals(4, layout.getChildCount()); assertEquals(SHOW_DIVIDERS_MIDDLE, layout.getShowDividers());
assertThat(layout.getVisibility()).isEqualTo(View.VISIBLE); assertThat(layout.getOrientation()).isEqualTo(VERTICAL); assertThat(layout.getChildCount()).isEqualTo(4); assertThat(layout.getShowDividers()).isEqualTo(SHOW_DIVIDERS_MIDDLE);
几乎所有你可能想测试的对象都有对应的断言,从 LinearLayout
到 ActionBar
到 Fragment
再到 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'