Mockito Strict Stubbing and The UnødvendigStubbingException

1. Oversikt

I denne raske opplæringen lærer vi om Mockito UnødvendigStubbingException. Dette unntaket er et av de vanligste unntakene vi sannsynligvis vil støte på når vi bruker stubber feil.

Vi begynner med å forklare filosofien bak streng stubbing og hvorfor Mockito oppfordrer til bruk som standard. Deretter tar vi en titt på nøyaktig hva dette unntaket betyr og under hvilke omstendigheter det kan oppstå. For å konkludere vil vi se et eksempel på hvordan vi kan undertrykke dette unntaket i testene våre.

For å lære mer om testing med Mockito, sjekk ut vår omfattende Mockito-serie.

2. Streng stubbing

Med versjon 1.x av Mockito var det mulig å konfigurere og samhandle med mocks uten noen form for begrensning. Dette betydde at tester over tid ofte ville bli overkompliserte og til tider vanskeligere å feilsøke.

Siden versjon 2. +, Mockito har introdusert nye funksjoner som skyver rammeverket mot "strenghet". Hovedmålene bak dette er:

  • Oppdag ubrukt stubber i testkoden
  • Reduser duplisering av testkode og unødvendig testkode
  • Fremme renere tester ved å fjerne ‘død’ kode
  • Bidra til å forbedre feilsøking og produktivitet

Å følge disse prinsippene hjelper oss med å lage renere tester ved å eliminere unødvendig testkode. De hjelper også med å unngå kopier og lim feil, så vel som andre utviklerovervåkning.

For å oppsummere rapporterer streng stubbing unødvendige stubber, oppdager stubbing av argumenter som ikke stemmer overens, og gjør testene våre tørrere (ikke gjenta deg selv). Dette muliggjør en ren og vedlikeholdbar kodebase.

2.1. Konfigurere strenge stubber

Siden Mockito 2. + brukes streng stubbing som standard når vi initialiserer mockene våre ved å bruke en av:

  • MockitoJUnitRunner
  • MockitoJUnit.rule ()

Mockito anbefaler på det sterkeste bruk av noen av de ovennevnte. Det er imidlertid også en annen måte å muliggjøre streng stubbing i testene våre når vi ikke bruker Mockito-regelen eller løperen:

Mockito.mockitoSession () .initMocks (dette) .strictness (Strictness.STRICT_STUBS) .startMocking (); 

Et siste viktig poeng å gjøre er at i Mockito 3.0 vil alle stubbinger være "strenge" og validert som standard.

3. UnødvendigStubbingException Eksempel

Enkelt sagt, en unødvendig stub er en stubben metodeanrop som aldri ble realisert under testutførelsen.

La oss ta en titt på et enkelt eksempel:

@Test public void givenUnusedStub_whenInvokingGetThenThrowUnnecessaryStubbingException () {when (mockList.add ("one")). ThenReturn (true); // dette kalles ikke når (mockList.get (anyInt ())). deretterRetur ("hei"); assertEquals ("Listen skal inneholde hei", "hei", mockList.get (1)); }

Når vi kjører denne enhetstesten, vil Mockito oppdage den ubrukt stubben og kaste en UnødvendigStubbingException:

org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unødvendig stubbing oppdaget. Ren og vedlikeholdbar testkode krever null unødvendig kode. Følgende stubbinger er unødvendige (klikk for å navigere til relevant kodelinje): 1. -> på com.baeldung.mockito.misusing.MockitoUnecessaryStubUnitTest.givenUnusedStub_whenInvokingGetThenThrowUnnecessaryStubbingException (MockitoUnecessaryStubUnitTest.java:37) Vennligst fjern unødvendig. Mer info: javadoc for UnødvendigStubbingException-klasse.

Heldigvis er det ganske klart fra feilmeldingen hva problemet er her. Vi kan også se at unntaksmeldingen til og med peker oss på den nøyaktige linjen som forårsaker feilen.

Hvorfor skjer dette? Vel, den første når påkallelse konfigurerer spottet vårt til å komme tilbake ekte når vi kaller legge til metode med argumentet "en". Imidlertid påkaller vi ikke denne metoden under resten av enhetstestutførelsen.

Mockito forteller oss at vår første når linjen er overflødig, og kanskje vi gjorde en feil når vi konfigurerte stubber.

Selv om dette eksemplet er trivielt, er det lett å forestille seg når man spotter et komplekst hierarki av objekter hvordan denne typen meldinger kan hjelpe feilsøking og ellers være veldig hjelpsomme.

4. Omgå streng strikking

Til slutt, la oss se hvordan vi kan omgå strenge stubber. Dette er også kjent som mild stubbing.

Noen ganger må vi konfigurere spesifikk stubbing for å være mild mens vi opprettholder alle de andre stubbings og mocks for å bruke streng stubbing:

@Test public void givenLenientdStub_whenInvokingGetThenThrowUnnecessaryStubbingException () {lenient (). When (mockList.add ("one")). ThenReturn (true); når (mockList.get (anyInt ())). deretterReturn ("hei"); assertEquals ("Listen skal inneholde hei", "hei", mockList.get (1)); }

I eksemplet ovenfor, vi bruker den statiske metoden Mockito.lenient () for å muliggjøre mild stubbing på legge til metoden til vår mock-liste.

Lette stubber omgår “strenge stubbing” -valideringsregler. For eksempel når stubbing blir erklært som mild, vil det ikke bli sjekket for potensielle stubbproblemer som unødvendig stubbing beskrevet tidligere.

5. Konklusjon

I denne korte artikkelen begynte vi med å introdusere konseptet med streng stubbing i Mockito og forstått filosofien bak hvorfor den ble introdusert og hvorfor den er viktig.

Deretter så vi på et eksempel på UnødvendigStubbingException før du avslutter med et eksempel på hvordan du muliggjør mild stubbing i testene våre.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found