编写测试并非开发 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'