Oikeiden olioiden vakoilu
Tutustukaa siihen, miten Mockito-spy-olioilla voidaan mockata oikeita olioita osittain ja kutsua niiden oikeita metodeja vuorovaikutuksia samalla verifioiden.
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ä kutsutaanwhen()-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.
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
- Palautusarvojen stubbaaminen
- Mockiton argumenttitäsmääjät
- Oikeiden olioiden vakoilu
- Poikkeusten heittäminen ja peräkkäiset kutsut