Cet article est l'article du 12ème jour du Calendrier de l'Avent Android 2016.
Bonjour. Depuis l'année dernière, j'ai changé ma classe en ingénieur Android et créé des applications Android au travail. Cette fois, j'écrirai également sur le test d'Android avec Dagger2.
Robolectric
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 La liste s'affiche lorsqu'il y a des données() {
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 La liste n'est pas affichée lorsque les données sont vides() {
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;
}
}
}
--Remplacez le composant référencé par Fragment dans l'activité pour le pilote avec une maquette réalisée avec Mockito. Avec cela, rien ne se passe même si l'injection qui injecte le module est appelée par Fragment, mais comme dao reste nul tel quel, je le définirai directement sur Fragment au moment de la configuration.
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 La liste s'affiche lorsqu'il y a des données() {
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 La liste n'est pas affichée lorsque les données sont vides() {
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