Programim dhe zhvillim, javascript, python, php, html

Espresso / Mockito verifikuar që metodë ishte quajtur

Unë kam një test të thjeshtë duke përdorur një activityTestRule që duhet të kontrollojë nëse një metodë e aktivitetit nën test është quajtur:

@Test
public void callLiveLocation() {
    MapSettingsActivity spy = spy(activityRule.getActivity());
    doNothing().when(spy).setLiveLocation();
    onView(withId(R.id.btn_map_current_location)).perform(click());
    verify(spy).setLiveLocation();
}

Metoda setLiveLocation() thirret kur kontrolloj në modalitetin e korrigjimit.
Megjithatë, konsola më thotë:

Kërkohet por nuk thirret: mapSettingsActivity.setLiveLocation(); -> në com.android.dx.mockito.InvocationHandlerAdapter.invoke(InvocationHandlerAdapter.java:53) Në fakt, nuk kishte asnjë ndërveprim me këtë tallje.

Si mund të kontrolloj nëse është thirrur metoda e aktivitetit nën testim?
Unë përdor lidhjen e të dhënave të Android për klikimin e butonit, i cili thërret një kthim kthimi, i cili nga ana tjetër thërret një metodë në aktivitetin nën testim.

Shënim:

Metoda është një metodë e thjeshtë për aktivitetin:

public void setLiveLocation() {
    super.startLocationListener();
}

Redakto:

Vura re se krijimi i spiunit kthehet i pavlefshëm për një arsye ende të panjohur:

MapSettingsActivity spy = spy(activityRule.getActivity());

  • A është setLiveLocation() një metodë përfundimtare? Cili version i Mockito është ky? Për një test Espresso ju duhet të përdorni mockito android 02.11.2017
  • @DavidRawson Nuk është një metodë përfundimtare dhe është versioni mockito 2.+. Më falni për përgjigjen e vonuar. 03.11.2017
  • A ju pengon të postoni pjesën androidTestCompilebuild.gradle tuaj? 04.11.2017

Përgjigjet:


1

Para së gjithash, kjo nuk është zgjidhje e saktë e problemit tuaj, por ndoshta do t'ju ndihmojë.

Kështu që unë e trajtova këtë problem të ngjashëm. Në përgjithësi: në mënyrë që Mockito të mund të zbulojë thirrjen e metodës në objektin spiun, kjo metodë duhet të thirret në objektin e spiunuar (nëse e kuptoni se për çfarë po flas, sepse nuk e kuptoj)). Nuk është e vërtetë në rastin tuaj. setLiveLocation juaj thirri një shembull real të aktivitetit, i cili ruhet në ActivityTestRule.

Shembulli im: Më duhet të verifikoj që metoda e përshtatësit updateDataSet() e RecyclerView thirret saktësisht një herë. Kështu e bëra në Kotlin:

    val adapter = activityTestRule.activity
            .find<RecyclerView>(R.id.reviewsList)
            .adapter as FlexibleAdapter<ReviewItem>

    assertNotNull(adapter)

    val spy = spy(adapter)

    activityTestRule.activity
            .runOnUiThread {
                activityTestRule.activity
                        .find<RecyclerView>(R.id.reviewsList)
                        .adapter = spy
            }

    doNothing().`when`(spy).updateDataSet(ArgumentMatchers.any())

    onView(withId(R.id.swipeRefresh)).perform(ViewActions.swipeDown())

    verify(spy, times(1)).updateDataSet(MOCKED_REVIEWS_FROM_SERVER.map(::ReviewItem))

Pra, në thelb unë marr përshtatësin nga Recycler dhe e ndryshoj atë në përshtatësin tim spiun. Testi im përfundoi me sukses vetëm kur bëra këtë zëvendësim. Në rastin tuaj ActivityTestRule mban shembullin e aktivitetit real, kështu që ju duhet disi ta zëvendësoni atë me objekt spiun. Nuk jam i sigurt se si ta bëj, por supozoj se ka mundësi për të krijuar nënklasë të këtij rregulli dhe për të krijuar spiun të aktivitetit ndoshta në konstruktor. Më pas do të merrni objektin e spiunuar dhe do ta përdorni për të verifikuar çdo thirrje.

16.01.2018
Materiale të reja

Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

Faketojeni derisa ta arrini me të dhënat false
A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

Si të përdorni kërkesën API në Python
Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

Një udhëzues hap pas hapi për të zotëruar React
Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

AI dhe Psikologjia — Pjesa 2
Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

Esencialet e punës ditore të kodit tim VS
Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..