[JAVA] Démarrez les tests d'interface utilisateur avec Dagger2 et Mockito

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.

DI utilisant Dagger2

Pourquoi vous avez besoin de DI pour les tests

Testez l'écran qui active DI

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));

fin

Recommended Posts

Démarrez les tests d'interface utilisateur avec Dagger2 et Mockito
Exemple de code pour la simulation de base et les tests avec Mockito 3 + JUnit 5
Test avec com.google.testing.compile
Démarrez k3s avec docker-compose
À partir de Swift Swift UI
Test de la logique d'envoi et de réception de demande avec MockWebServer dans JUnit
Java: démarrez WAS avec Docker et déployez votre propre application