[JAVA] Starten Sie die UI-Tests mit Dagger2 und Mockito

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.

DI mit Dolch2

Warum Sie DI zum Testen benötigen

Testen Sie den Bildschirm, der DI aktiviert

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

Ende

Recommended Posts

Starten Sie die UI-Tests mit Dagger2 und Mockito
Beispielcode für das grundlegende Verspotten und Testen mit Mockito 3 + JUnit 5
Testen mit com.google.testing.compile
Starten Sie k3s mit Docker-Compose
Beginnend mit Swift Swift UI
Testen der Sende- und Empfangslogik von Anforderungen mit MockWebServer in JUnit
Java: Starten Sie WAS mit Docker und stellen Sie Ihre eigene Anwendung bereit