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