Writing tests is not the most glamorous part of developing an Android application but it is an invaluable one. Using libraries like JUnit and AssertJ provide a great starting point for writing tests.
This library is an extension of AssertJ which aims to make it even easier to test Android.
assertThat(view).isGone();
assertEquals(View.GONE, view.getVisibility());
assertThat(view.getVisibility()).isEqualTo(View.GONE);
When failing, the AssertJ Android assertion produces an output which allows you to immediately recognize the problem: Expected visibility <gone> but was <invisible>.
Compare that to the output of regular AssertJ expected:<[8]> but was:<[4]>
and regular JUnit expected: <8> but was: <4>
and you should immediately see the advantage.
Because AssertJ Android offers assertions directly on objects rather than properties they can be chained together.
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);
Assertions exist for nearly every object that you would ever want to test, from LinearLayout
to ActionBar
to Fragment
to MenuItem
. Everything in the support library is included too.
To get started writing tests add the following import:
import static org.assertj.android.api.Assertions.assertThat;
Modules are also provided for the add-on Android libraries. Add the dependency (listed below) and use the following imports:
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;
The provided assertions have also been designed to be extended for any custom controls you have developed.
public class CustomLayout extends LinearLayout { public int getBehavior() { /* ... */ } }
Use the following pattern to set up your assertions.
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; } }
Now static import CustomLayoutAssert.assertThat
in your test classes.
For more information about writing custom assertions see the official documentation.
Android module:
androidTestCompile 'com.squareup.assertj:assertj-android:1.0.0'
support-v4 module:
androidTestCompile 'com.squareup.assertj:assertj-android-support-v4:1.0.0'
Google Play Services module:
androidTestCompile 'com.squareup.assertj:assertj-android-play-services:1.0.0'
appcompat-v7 module:
androidTestCompile 'com.squareup.assertj:assertj-android-appcompat-v7:1.0.0'
mediarouter-v7 module:
androidTestCompile 'com.squareup.assertj:assertj-android-mediarouter-v7:1.0.0'
gridlayout-v7 module:
androidTestCompile 'com.squareup.assertj:assertj-android-gridlayout-v7:1.0.0'
cardview-v7 module:
androidTestCompile 'com.squareup.assertj:assertj-android-cardview-v7:1.0.0'
recyclerview-v7 module:
androidTestCompile 'com.squareup.assertj:assertj-android-recyclerview-v7:1.0.0'
pallete-v7 module:
androidTestCompile 'com.squareup.assertj:assertj-android-pallete-v7:1.0.0'