Testauksen hallinta: JUnit, Mockito ja integraatiotestit · Oppitunti

Mukautetut vastaukset ja callback-funktiot

Toteuttakaa mukautettua logiikkaa mock-metodikutsuille `Answer`-rajapintojen avulla monimutkaisen toiminnan simuloimiseksi.

Oppitunti 1/412 vaihetta

Mukautetut vastaukset ja callback-funktiot on ilmainen Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Testauksen hallinta: JUnit, Mockito ja integraatiotestit-kurssilla on yhteensä 4 oppituntia.

Yksinkertaista stubbausta pidemmälle

Joskus kiinteän arvon palauttaminen when().thenReturn()-menetelmällä ei yksin riitä mock-objekteillesi.

  • Mitä jos mock-metodi tarvitsee muokata sille välitettyä argumenttia?
  • Mitä jos sen tarvitsee suorittaa callback-funktio?
  • Mitä jos sen palautusarvo riippuu monista syötteistä monimutkaisella ja dynaamisella tavalla?

Nämä edistyneet tilanteet edellyttävät mukautettua logiikkaa mock-objekteissasi.

Mockito's Answer -toiminnon esittely

Mockito tarjoaa org.mockito.stubbing.Answer-rajapinnan. Tämän tehokkaan työkalun avulla voit määrittää mockatun metodikutsun mukautetun toiminnan.

  • Ajattele sitä pienenä koodinpätkänä, joka suoritetaan aina, kun mockattua metodia kutsutaan.
  • Answer-rajapinnassa on yksi metodi: Object answer(Invocation invocation) throws Throwable;.

Sen avulla voit hallita mockin vastauksia tarkasti.

answer()-metodin rakenne

answer()-metodissa toteutat mukautetun logiikkasi. Se vastaanottaa InvocationOnMock-olion, josta käytetään usein vain nimitystä invocation.

  • InvocationOnMock-olio tarjoaa olennaiset tiedot metodikutsusta:
    • Mitä metodia kutsuttiin?
    • Mitä argumentteja välitettiin?
    • Mikä mock-olio oli mukana?

Näiden tietojen avulla voit päättää, mitä palautetaan, heitetään poikkeuksena tai mitä sivuvaikutuksia suoritetaan.

Joustavuus doAnswer-menetelmällä

Vaikka voit käyttää when().thenAnswer()-menetelmää, Mockiton doAnswer()-metodi on usein joustavampi ja yleisemmin käytetty, erityisesti void-metodien kanssa tai yhdistettynä muihin stubbauksiin.

  • doAnswer() mahdollistaa metodikutsun toiminnan määrittämisen ennen when()-määritystä.
  • Se on erityisen hyödyllinen, kun tarvitset:
    • Argumenttien tallentamista.
    • Callbackien kutsumista.
    • Argumentteina välitettyjen olioiden tilan muuttamista.

Mukautettu palautuslogiikka

Seuraavaksi tarkastelemme, miten doAnswer-menetelmää käytetään syöteargumentista riippuvan arvon palauttamiseen. Tässä esimerkissä mockimme kaksinkertaistaa syötteenä annetun luvun.

import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

// A simple interface to mock
interface Calculator {
    int calculate(int input);
}

public class Main {
    public static void main(String[] args) {
        // Create a mock object for our Calculator interface
        Calculator mockCalculator = Mockito.mock(Calculator.class);

        // Define custom answer to double the input argument
        Mockito.doAnswer(new Answer<Integer>() {
            @Override
            public Integer answer(InvocationOnMock invocation) throws Throwable {
                // Get the first argument (index 0) as an Integer
                Integer arg = invocation.getArgument(0);
                return arg * 2; // Return double the argument
            }
        }).when(mockCalculator).calculate(Mockito.anyInt()); // Apply to any int input

        // Test the custom behavior of the mock
        System.out.println("Result for 5: " + mockCalculator.calculate(5));
        System.out.println("Result for 10: " + mockCalculator.calculate(10));
    }
}

Callbackien simulointi

Yksi erittäin yleinen ja tehokas doAnswer-menetelmän käyttötapa on asynkronisten toimintojen simulointi tai callbackien kutsuminen.

  • Kuvittele palvelu, joka vastaanottaa argumenttina Callback-rajapinnan, esimerkiksi Consumer-olion.
  • doAnswer-menetelmällä voit kutsua kyseisen callbackin onSuccess- tai onFailure-metodia manuaalisesti.

Näin voit testata, miten sovelluksesi koodi reagoi callbackin erilaisiin lopputuloksiin ilman todellista asynkronista suorittamista.

Callbackin mockaaminen

Tässä simuloimme DataService-palvelua, joka kutsuu Consumer-callbackia. doAnswer-menetelmällä voimme käynnistää callbackin tietyllä arvolla, kun fetchData-metodia kutsutaan.

import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.function.Consumer;

// An interface representing a service that fetches data asynchronously
interface DataService {
    void fetchData(String query, Consumer<String> callback);
}

public class Main {
    public static void main(String[] args) {
        DataService mockService = Mockito.mock(DataService.class);

        // Configure the mock to simulate fetching data and calling the callback
        Mockito.doAnswer(new Answer<Void>() {
            @Override
            public Void answer(InvocationOnMock invocation) throws Throwable {
                // Get the arguments passed to fetchData
                String query = invocation.getArgument(0); // The first argument is the query
                Consumer<String> callback = invocation.getArgument(1); // The second is the callback
                
                // Simulate a successful data fetch by invoking the callback
                callback.accept("Data for '" + query + "' fetched successfully!");
                return null; // Void methods in doAnswer return null
            }
        }).when(mockService).fetchData(Mockito.anyString(), Mockito.any(Consumer.class));

        // Our application code would typically use this service
        System.out.println("Application requesting user data...");
        mockService.fetchData("user:456", result -> {
            System.out.println("Application received data: " + result);
        });
        System.out.println("Application finished request setup.");
    }
}

Invocation-olion tarkempi tarkastelu

answer()-metodille välitetty InvocationOnMock-olio, josta käytetään myös nimitystä invocation, on tehokas kontekstiolio.

  • invocation.getArguments(): palauttaa taulukon, joka sisältää kaikki mockatulle metodille välitetyt argumentit.
  • invocation.getArgument(index): palauttaa tietyn argumentin sen indeksin perusteella.
  • invocation.getMethod(): antaa kutsutun Method-olion, mikä mahdollistaa reflektion käytön.
  • invocation.getMock(): palauttaa itse mock-olion.
  • invocation.callRealMethod(): spy-olioiden kanssa tämä mahdollistaa varsinaisen metodin kutsumisen.

Vinkkejä Answerin käyttöön

Mukautetut Answer-toteutukset ovat tehokkaita, mutta niitä on tärkeää käyttää harkiten, jotta testit pysyvät ylläpidettävinä ja selkeinä:

  • Pidä ne yksinkertaisina: Jos answer-logiikasta tulee liian monimutkaista, se voi viitata tuotantokoodin suunnitteluongelmaan tai liian monimutkaiseen testiasetukseen.
  • Suosi yksinkertaisempaa stubbausta: Valitse aina yksinkertaisemmat stubbauksen menetelmät, kuten thenReturn(), thenThrow() tai thenCallRealMethod(), jos niillä voidaan saavuttaa haluttu toiminta.
  • Testaa Answer itse: Jos Answer-toteutus on hyvin monimutkainen, harkitse sen erottamista omaksi luokakseen ja yksikkötestin kirjoittamista kyseiselle luokalle.

Milloin Answeria kannattaa käyttää

Seuraavissa tyypillisissä tilanteissa Answer-rajapinta, yleensä doAnswer()-menetelmän kautta, on todella hyödyllinen:

  • Dynaamiset palautusarvot: Kun palautusarvo riippuu syöteargumenteista monimutkaisella tai laskennallisella tavalla.
  • Sivuvaikutukset: Kun viiteparametreina välitettyjä argumentteja muokataan, esimerkiksi oliota päivitetään.
  • Callbackit: Onnistumis- tai epäonnistumiscallbackien käynnistäminen asynkronisten toimintojen simuloimiseksi.
  • Toimintojen ketjuttaminen: Vuorovaikutusten tai tilan muutosten sarjan simulointi yhden mock-kutsun sisällä.

Mukautettu mock-toiminta

Testaat UserService-palvelua, joka on riippuvainen UserRepository-oliosta. UserRepository-oliolla on metodi save(User user), joka yleensä päivittää käyttäjän tunnisteen sen jälkeen, kun käyttäjä on tallennettu tietokantaan.

Haluat mockata UserRepository-olion tämän toiminnan simuloimiseksi ilman oikeaan tietokantaan yhdistämistä. Oletetaan, että käytettävissä on User-luokka, jolla on metodi setId(Long id).

Kertaus: dynaamiset mockit

Olet oppinut lisäämään mock-objekteihin dynaamista ja monimutkaista toimintaa Mockiton Answer-rajapinnan ja doAnswer-metodin avulla.

  • Answer-rajapinnan avulla voit määrittää mukautettua logiikkaa, joka suoritetaan, kun mockattua metodia kutsutaan.
  • InvocationOnMock-olio tarjoaa olennaisen kontekstin, kuten metodin argumentit ja mock-olion.
  • doAnswer sopii erityisesti dynaamisiin palautusarvoihin, callbackien simulointiin tai viiteparametreina välitettyjen argumenttien muokkaamiseen.

Muista käyttää `Answer`-toimintoa harkiten ja suosia yksinkertaisempaa stubbausta aina, kun se on mahdollista, jotta testit pysyvät selkeinä ja kohdennettuina.

Aloita maksutta

Opi Testauksen hallinta: JUnit, Mockito ja integraatiotestit tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Mukautetut vastaukset ja callback-funktiot” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppimispolun 3 oppituntia, myös oppitunnin “Mukautetut vastaukset ja callback-funktiot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Testauksen hallinta: JUnit, Mockito ja integraatiotestit-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Mukautetut vastaukset ja callback-funktiot”?

Toteuttakaa mukautettua logiikkaa mock-metodikutsuille `Answer`-rajapintojen avulla monimutkaisen toiminnan simuloimiseksi. Harjoittelet Testauksen hallinta: JUnit, Mockito ja integraatiotestit-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Testauksen hallinta: JUnit, Mockito ja integraatiotestit-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Mukautetut vastaukset ja callback-funktiot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppitunnilla?

Kyllä. Jokainen Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Mukautetut vastaukset ja callback-funktiot
  2. Staattisten metodien ja konstruktorien mockaus
  3. Mockiton parhaat käytännöt
  4. Argumenttien kaappaaminen ArgumentCaptorilla
← Takaisin: Testauksen hallinta: JUnit, Mockito ja integraatiotestit