Testauksen hallinta: JUnit, Mockito ja integraatiotestit · Oppitunti

Oikeiden olioiden vakoilu

Tutustukaa siihen, miten Mockito-spy-olioilla voidaan mockata oikeita olioita osittain ja kutsua niiden oikeita metodeja vuorovaikutuksia samalla verifioiden.

Oppitunti 3/411 vaihetta

Oikeiden olioiden vakoilu on ilmainen Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Mitä Mockiton spy-oliot ovat?

Olette oppineet luomaan Mockitolla mock-olioita, joiden toimintaa voidaan hallita täysin. Entä jos haluatte muuttaa vain muutamaa metodia ja säilyttää muiden metodien alkuperäisen toiminnan?

Tässä spy-oliot ovat avuksi! Spy-olio käärii oikean olion ja mahdollistaa seuraavat asiat:

  • Olion oikeiden metodien kutsuminen oletusarvoisesti.
  • Tiettyjen metodien ylikirjoittaminen (stubbaaminen) ennalta määritettyjen arvojen palauttamiseksi.
  • Oikeaan olioon kohdistuvien vuorovaikutusten verifiointi.

Ajatelkaa sitä osittaisena mockauksena: käytätte oikeaa oliota, mutta teette siihen muutaman muutoksen.

Ensimmäisen spy-olion luominen

Spy-olion luominen on suoraviivaista. Käyttäkää Mockito.mock()-metodin sijaan Mockito.spy()-metodia ja välittäkää sille sen oikean olion ilmentymä, jota haluatte tarkkailla.

Määritellään yksinkertainen DataService-luokka, jota käytämme esimerkeissä. Tämä palvelu suorittaa joitakin toimintoja.

import org.mockito.Mockito;

public class DataService {
    public String fetchData(String id) {
        return "Real data for " + id;
    }

    public int processData(String data) {
        return data.length();
    }
}

public class Main {
    public static void main(String[] args) {
        DataService realService = new DataService();
        DataService spyService = Mockito.spy(realService);

        System.out.println("Spy created successfully!");
    }
}

Spy-oliot kutsuvat oikeita metodeja

Spy-olion keskeinen ominaisuus on, että se kutsuu oletusarvoisesti käärimänsä olion oikeita metodeja. Tämä poikkeaa mock-oliosta, jolla ei ole oikeaa toteutusta ja joka palauttaa oletusarvoja.

Katsotaan, kuinka spyService kutsuu oikeaa metodia:

import org.mockito.Mockito;

public class DataService {
    public String fetchData(String id) {
        System.out.println("--- Calling REAL fetchData for ID: " + id + " ---");
        return "Real data for " + id;
    }

    public int processData(String data) {
        return data.length();
    }
}

public class Main {
    public static void main(String[] args) {
        DataService realService = new DataService();
        DataService spyService = Mockito.spy(realService);

        String result = spyService.fetchData("123");
        System.out.println("Result from spy: " + result);

        int processed = spyService.processData("Hello");
        System.out.println("Processed data length: " + processed);
    }
}

Spy-olion stubbaus: toiminnan ylikirjoittaminen

Vaikka spy-oliot kutsuvat oletusarvoisesti oikeita metodeja, voitte silti stubbata ne palauttamaan tiettyjä arvoja tai heittämään poikkeuksia aivan kuten mock-olioiden kanssa. Näin voitte hallita osaa olion toiminnasta.

Spy-oliota stubbattessa on kuitenkin usein turvallisempaa käyttää doReturn().when()-syntaksia:

  • Mockito.when(spy.method()).thenReturn(value) saattaa suorittaa oikean metodin ensin, jos sitä kutsutaan when()-osan aikana.
  • Mockito.doReturn(value).when(spy).method() estää oikean metodin kutsumisen stubbaamisen aikana. Tämä on tärkeää, jos oikealla metodilla on sivuvaikutuksia tai se heittää poikkeuksia.

Spy-olion stubbaus käytännössä

Stubataan spyService-olion fetchData-metodi palauttamaan mukautettu arvo tietylle tunnisteelle, kun taas muut kutsut ohjautuvat edelleen oikeaan metodiin:

import org.mockito.Mockito;

public class DataService {
    public String fetchData(String id) {
        System.out.println("--- Calling REAL fetchData for ID: " + id + " ---");
        return "Real data for " + id;
    }

    public int processData(String data) {
        return data.length();
    }
}

public class Main {
    public static void main(String[] args) {
        DataService realService = new DataService();
        DataService spyService = Mockito.spy(realService);

        // Stubbing the spy for a specific input
        Mockito.doReturn("Mocked data for specific ID")
               .when(spyService)
               .fetchData("specialId");

        // This call will return the mocked data
        String result1 = spyService.fetchData("specialId");
        System.out.println("Result for specialId: " + result1);

        // This call will go to the real method
        String result2 = spyService.fetchData("regularId");
        System.out.println("Result for regularId: " + result2);
    }
}

Spy-olion vuorovaikutusten verifiointi

Aivan kuten mock-olioiden kanssa, voitte käyttää Mockito.verify()-metodia varmistaaksenne, että tiettyjä metodeja kutsuttiin spy-oliolla. Tämä on tehokas tapa varmistaa, että koodinne toimii oikean olion kanssa odotetulla tavalla.

verify() toimii spy-olioilla täsmälleen samalla tavalla kuin mock-olioilla. Voitte tarkistaa:

  • Kutsuttiinko metodia.
  • Kuinka monta kertaa sitä kutsuttiin.
  • Millä argumenteilla sitä kutsuttiin.

Esimerkki spy-kutsujen verifioinnista

Varmistetaan, että fetchData-metodia kutsuttiin spy-oliolla, vaikka se suoritti oikean toteutuksensa:

import org.mockito.Mockito;

public class DataService {
    public String fetchData(String id) {
        System.out.println("--- Calling REAL fetchData for ID: " + id + " ---");
        return "Real data for " + id;
    }

    public int processData(String data) {
        return data.length();
    }
}

public class Main {
    public static void main(String[] args) {
        DataService realService = new DataService();
        DataService spyService = Mockito.spy(realService);

        // Call a method on the spy (it will execute the real method)
        spyService.fetchData("user1");
        spyService.processData("data1");
        spyService.fetchData("user2");

        // Verify interactions
        Mockito.verify(spyService).fetchData("user1");
        Mockito.verify(spyService, Mockito.times(2)).fetchData(Mockito.anyString());
        Mockito.verify(spyService).processData("data1");

        System.out.println("Verification successful!");
    }
}

Spy-oliot ja mock-oliot: keskeinen ero

On tärkeää ymmärtää, milloin kannattaa käyttää spy-oliota ja milloin perinteistä mock-oliota:

  • Mock-oliot: Luovat täysin keinotekoisen olion. Kaikki metodit ovat ”tyhjiä” ja palauttavat oletusarvoja, ellette stubbbaa niitä erikseen. Ne sopivat erinomaisesti testattavan yksikön eristämiseen.
  • Spy-oliot: Käärivät oikean olion. Kaikki metodit suorittavat oikean toteutuksensa, ellette stubbbaa niitä erikseen. Ne sopivat tilanteisiin, joissa haluatte käyttää suurinta osaa oikean olion toiminnasta mutta hallita muutamia tiettyjä vuorovaikutuksia.

Suosikaa mock-olioita, kun tarvitsette todellista yksikkötestin eristystä. Käyttäkää spy-olioita monimutkaisten olioiden kanssa, kun vain muutamaa metodia on hallittava, tai käsitellessänne vanhaa koodia.

Milloin spy-olioita kannattaa käyttää

Spy-oliot ovat erityisen hyödyllisiä seuraavissa tilanteissa:

  • Testaatte luokkaa, joka käsittelee monimutkaista riippuvuutta, ja tarvitsette ylikirjoittaa vain pienen osan riippuvuuden toiminnasta.
  • Käytössänne on vanha luokka, jossa on paljon metodeja. Täyden mock-olion luominen olisi työlästä, mutta joidenkin metodien kutsuminen tai tiettyjen arvojen palauttaminen on varmistettava.
  • Haluatte testata oikean olion osittaista toimintaa korvaamatta sitä kokonaan.

Käyttäkää niitä kuitenkin harkiten. Spy-olioiden liiallinen käyttö voi johtaa vähemmän eristettyihin testeihin, joita on vaikeampi ylläpitää.

Pikatarkistus: spy-olion toiminta

Tarkastelkaa Logger-luokkaa, jossa on konsoliin tulostava log(String message)-metodi. Jos luotte spy-olion new Logger()-oliosta, mitä tapahtuu, kun kutsutte spyLogger.log("Test")-metodia ilman stubbausta?

Kertaus: oikeiden olioiden tarkkailu spy-olioilla

Olette nyt oppineet käyttämään Mockiton spy-olioita!

  • Spy-oliot käärivät oikeita olioita, joten niiden oikeita metodeja voidaan käyttää oletusarvoisesti.
  • Luotte ne käyttämällä Mockito.spy(realObject)-kutsua.
  • Voitte stubbata tiettyjä metodeja käyttämällä rakennetta doReturn().when(spy).method() ja ylikirjoittaa niiden toiminnan.
  • Voitte verifioida vuorovaikutuksia spy-olioilla käyttämällä Mockito.verify()-metodia aivan kuten mock-olioilla.
  • Käyttäkää spy-olioita harkiten, ensisijaisesti silloin, kun tarvitsette osittaista hallintaa oikeasta oliosta täyden eristyksen sijaan.

Tämä joustavuus auttaa kirjoittamaan kohdennetumpia testejä monimutkaisia tilanteita varten.

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 ”Oikeiden olioiden vakoilu” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppimispolun 3 oppituntia, myös oppitunnin “Oikeiden olioiden vakoilu”. 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 ”Oikeiden olioiden vakoilu”?

Tutustukaa siihen, miten Mockito-spy-olioilla voidaan mockata oikeita olioita osittain ja kutsua niiden oikeita metodeja vuorovaikutuksia samalla verifioiden. 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 3/4.

Kuinka kauan ”Oikeiden olioiden vakoilu”-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. Palautusarvojen stubbaaminen
  2. Mockiton argumenttitäsmääjät
  3. Oikeiden olioiden vakoilu
  4. Poikkeusten heittäminen ja peräkkäiset kutsut
← Takaisin: Testauksen hallinta: JUnit, Mockito ja integraatiotestit