Dieser Artikel ist der 12. Tagesartikel von Android Adventskalender 2016.
Hallo. Seit letztem Jahr habe ich meine Klasse auf einen Android-Ingenieur umgestellt und Android-Apps bei der Arbeit erstellt. Dieses Mal werde ich auch über das Testen von Android mit Dagger2 schreiben.
Robolectric --Aktivität ist nur ein Mist, also schreibe einen Test nur für Fragment
ListFragmentTest
@RunWith(RobolectricTestRunner.class)
public class ListFragmentTest {
@Mock
ListDataDao mockDao;
private ListFragment fragment;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
fragment = ListFragment.newInstance();
fragment.dao = mockDao;
}
@Test
public void Die Liste wird angezeigt, wenn Daten vorhanden sind() {
List<String> mockData = new ArrayList<>();
mockData.add("test1");
mockData.add("test2");
mockData.add("test3");
when(mockDao.getData()).thenReturn(mockData);
SupportFragmentTestUtil.startFragment(fragment, DriverActivity.class);
RecyclerView recyclerView = (RecyclerView) fragment.getView().findViewById(R.id.recycler_view);
recyclerView.measure(0, 0);
recyclerView.layout(0, 0, 100, 1000);
TextView textEmptyView = (TextView) fragment.getView().findViewById(R.id.empty);
TextView itemView1 = (TextView) recyclerView.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.list_item_text);
TextView itemView3 = (TextView) recyclerView.findViewHolderForAdapterPosition(2).itemView.findViewById(R.id.list_item_text);
assertThat(recyclerView.getVisibility(), is(View.VISIBLE));
assertThat(recyclerView.getAdapter().getItemCount(), is(3));
assertThat(itemView1.getText(), is("test1"));
assertThat(itemView3.getText(), is("test3"));
assertThat(textEmptyView.getVisibility(), is(View.GONE));
}
@Test
public void Die Liste wird nicht angezeigt, wenn die Daten leer sind() {
List<String> mockData = new ArrayList<>();
when(mockDao.getData()).thenReturn(mockData);
SupportFragmentTestUtil.startFragment(fragment, DriverActivity.class);
RecyclerView recyclerView = (RecyclerView) fragment.getView().findViewById(R.id.recycler_view);
TextView textEmptyView = (TextView) fragment.getView().findViewById(R.id.empty);
assertThat(recyclerView.getVisibility(), is(View.GONE));
assertThat(textEmptyView.getVisibility(), is(View.VISIBLE));
}
public static class DriverActivity extends AppCompatActivity implements HasComponent<ListActivityComponent> {
@Override
public ListActivityComponent getComponent() {
ListActivityComponent activityComponent = mock(ListActivityComponent.class);
ListFragmentComponent fragmentComponent = mock(ListFragmentComponent.class);
when(activityComponent.plus(any(ListFragmentModule.class))).thenReturn(fragmentComponent);
return activityComponent;
}
}
}
Espresso
ListActivityUITest.java
@RunWith(AndroidJUnit4.class)
public class ListActivityUITest {
@Mock
ApplicationComponent applicationComponent;
@Mock
ListActivityComponent activityComponent;
@Mock
ListFragmentComponent fragmentComponent;
@Mock
ListDataDao mockDao;
@Rule
public ActivityTestRule<ListActivity> activityRule = new ActivityTestRule<>(ListActivity.class, true, false);
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
SampleApplication app = (SampleApplication) InstrumentationRegistry
.getTargetContext()
.getApplicationContext();
app.setComponent(applicationComponent);
when(applicationComponent.plus(any(ListActivityModule.class)))
.thenReturn(activityComponent);
when(activityComponent.plus(any(ListFragmentModule.class)))
.thenReturn(fragmentComponent);
doAnswer(invocation -> {
ListFragment fragment = (ListFragment) invocation.getArguments()[0];
fragment.dao = mockDao;
return fragment;
}).when(fragmentComponent).inject(any(ListFragment.class));
}
@Test
public void Die Liste wird angezeigt, wenn Daten vorhanden sind() {
List<String> mockData = new ArrayList<>();
mockData.add("test1");
mockData.add("test2");
mockData.add("test3");
when(mockDao.getData()).thenReturn(mockData);
activityRule.launchActivity(new Intent());
onView(withId(R.id.recycler_view))
.check(matches(hasDescendant(withText("test1"))));
onView(withId(R.id.recycler_view))
.check(matches(hasDescendant(withText("test2"))));
onView(withId(R.id.recycler_view))
.check(matches(hasDescendant(withText("test3"))));
onView(withId(R.id.empty))
.check(matches(not(isDisplayed())));
}
@Test
public void Die Liste wird nicht angezeigt, wenn die Daten leer sind() {
List<String> mockData = new ArrayList<>();
when(mockDao.getData()).thenReturn(mockData);
activityRule.launchActivity(new Intent());
onView(withId(R.id.empty))
.check(matches(isDisplayed()));
onView(withId(R.id.recycler_view))
.check(matches(not(isDisplayed())));
}
}
doAnswer(invocation -> {
ListFragment fragment = (ListFragment) invocation.getArguments()[0];
fragment.dao = mockDao;
return fragment;
}).when(fragmentComponent).inject(any(ListFragment.class));
Recommended Posts