Spring Boot Integration Testing med Embedded MongoDB

1. Oversikt

I denne opplæringen lærer vi hvordan du bruker Flapdoodle's innebygde MongoDB-løsning sammen med Spring Boot for å kjøre MongoDB-integrasjonstester jevnt.

MongoDB er en populær NoSQL-dokumentdatabase. Takket være høy skalerbarhet, innebygd skjæring og utmerket fellestøtte blir det ofte ansett som “de NoSQL-lagring ”av mange utviklere.

Som med annen utholdenhetsteknologi, det er viktig å kunne teste databaseintegrasjon med resten av applikasjonen vår enkelt. Heldigvis tillater Spring Boot oss å skrive den typen tester enkelt.

2. Maven-avhengigheter

La oss først sette opp Maven-foreldrene for Boot-prosjektet vårt.

Takk til foreldrene vi trenger ikke å definere versjon for hver Maven-avhengighet manuelt.

Vi kommer naturlig til å bruke Spring Boot:

 org.springframework.boot spring-boot-starter-parent 2.3.3.RELEASE 

Du finner den siste Boot-versjonen her.

Siden vi la til Spring Boot-foreldre, kan vi legge til nødvendige avhengigheter uten å spesifisere deres versjoner:

 org.springframework.boot spring-boot-starter-data-mongodb 

spring-boot-starter-data-mongodb vil aktivere vårstøtte for MongoDB:

 de.flapdoodle.embed de.flapdoodle.embed.mongo test 

de.flapdoodle.embed.mongo gir innebygd MongoDB for integrasjonstester.

3. Test ved hjelp av innebygd MongoDB

Denne delen dekker to scenarier: Spring Boot test og manuell test.

3.1. Spring Boot Test

Etter å ha lagt til de.flapdoodle.embed.mongo avhengighet Spring Boot vil automatisk prøve å laste ned og starte den innebygde MongoDB når du kjører tester.

Pakken lastes ned bare én gang for hver versjon, slik at påfølgende tester kjører mye raskere.

På dette stadiet skal vi kunne starte og bestå prøven JUnit 5-integrasjonstest:

@DataMongoTest @ExtendWith (SpringExtension.class) offentlig klasse MongoDbSpringIntegrationTest {@DisplayName ("gitt objekt for å lagre" + "når lagre objekt ved hjelp av MongoDB-mal" + "så blir objektet lagret") @Test offentlig ugyldig test (@Autowired MongoTemplate mongoTemplate) {// gitt DBObject objectToSave = BasicDBObjectBuilder.start () .add ("nøkkel", "verdi") .get (); // når mongoTemplate.save (objectToSave, "samling"); // deretter assertThat (mongoTemplate.findAll (DBObject.class, "samling")). ekstrahering ("nøkkel") .containsOnly ("verdi"); }}

Som vi kan se, ble den innebygde databasen automatisk startet av Spring, som også skal logges i konsollen:

... Starter MongodbExampleApplicationTests på arroyo med PID 10413 ...

3.2. Manuell konfigurasjonstest

Spring Boot vil automatisk starte og konfigurere den innebygde databasen og deretter injisere MongoTemplate eksempel for oss. Derimot, noen ganger kan det hende vi trenger å konfigurere innebygd Mongo-database manuelt (f.eks. når du tester en spesifikk DB-versjon).

Følgende utdrag viser hvordan vi kan konfigurere den innebygde MongoDB-forekomsten manuelt. Dette tilsvarer omtrent den forrige vårprøven:

class ManualEmbeddedMongoDbIntegrationTest {private static final String CONNECTION_STRING = "mongodb: //% s:% d"; privat MongodExecutable mongodExecutable; privat MongoTemplate mongoTemplate; @AfterEach void clean () {mongodExecutable.stop (); } @BeforeEach ugyldig oppsett () kaster unntak {String ip = "localhost"; int port = 27017; IMongodConfig mongodConfig = ny MongodConfigBuilder (). Versjon (Version.Main.PRODUCTION) .net (nytt Net (ip, port, Network.localhostIsIPv6 ())) .build (); MongodStarter starter = MongodStarter.getDefaultInstance (); mongodExecutable = starter.prepare (mongodConfig); mongodExecutable.start (); mongoTemplate = ny MongoTemplate (MongoClients.create (String.format (CONNECTION_STRING, ip, port)), "test"); } @DisplayName ("gitt objekt for å lagre" + "når lagre objekt ved hjelp av MongoDB-mal" + "så blir objektet lagret") @Test ugyldig test () kaster Unntak {// gitt DBObject objectToSave = BasicDBObjectBuilder.start () .add ( "nøkkel", "verdi") .get (); // når mongoTemplate.save (objectToSave, "samling"); // deretter assertThat (mongoTemplate.findAll (DBObject.class, "samling")). ekstrahering ("nøkkel") .containsOnly ("verdi"); }}

Merk at vi raskt kan lage MongoTemplate bønne konfigurert til å bruke den manuelt konfigurerte innebygde databasen og registrere den i vårbeholderen ved bare å opprette, f.eks @TestConfiguration med @Bønne metode som kommer tilbake ny MongoTemplate (MongoClients.create (connectionString, “test”).

Flere eksempler finnes på det offisielle Flapdoodle's GitHub repository.

3.3. Hogst

Vi kan konfigurere loggmeldinger for MongoDB når du kjører integrasjonstester ved å legge til disse to egenskapene til src / test / resources / application.propertes fil:

logging.level.org.springframework.boot.autoconfigure.mongo.embedded logging.level.org.mongodb

For eksempel, for å deaktivere logging, setter vi bare verdiene til av:

logging.level.org.springframework.boot.autoconfigure.mongo.embedded = av logging.level.org.mongodb = av

3.4. Bruke en ekte database om produksjon

Siden vi la til de.flapdoodle.embed.mongo avhengighet ved hjelp testdet er ikke nødvendig å deaktivere innebygd database når du kjører på produksjon. Alt vi trenger å gjøre er å spesifisere MongoDB-tilkoblingsdetaljer (f.eks. Vert og port), og vi er gode å gå.

For å bruke en innebygd DB utenfor testene, kan vi bruke vårprofiler som registrerer retten MongoClient (innebygd eller produksjon) avhengig av den aktive profilen.

Vi må også endre omfanget av produksjonsavhengighet til kjøretid.

4. Embedded Testing Controversy

Å bruke innebygd database kan se ut som en god idé i begynnelsen. Det er faktisk en god tilnærming når vi vil teste om søknaden vår oppfører seg riktig i områder som:

  • ObjectDocument-kartleggingskonfigurasjon
  • Egendefinerte vedvarende livssyklushendelseslyttere (se AbstraktMongoEventListener)
  • Logikken til hvilken som helst kode som fungerer direkte med utholdenhetslaget

Dessverre, bruk av en innebygd server kan ikke betraktes som "full integrasjonstesting". Flapdoodle's innebygde MongoDB er ikke et offisielt MongoDB-produkt. Derfor kan vi ikke være sikre på at den oppfører seg akkurat som i produksjonsmiljøet.

Hvis vi vil kjøre kommunikasjonstester i miljøet så nær produksjonen som mulig, er en bedre løsning å bruke en miljøbeholder som Docker.

For å finne ut mer om Docker, les vår forrige artikkel her.

5. Konklusjon

Spring Boot gjør det ekstremt enkelt å kjøre tester som bekrefter riktig dokumentkartlegging og databaseintegrasjon. Ved å legge til riktig Maven-avhengighet, kan vi umiddelbart bruke MongoDB-komponenter i Spring Boot-integrasjonstester.

Vi må huske det innebygd MongoDB-server kan ikke betraktes som erstatning for en “ekte” server.

Den fullstendige kildekoden for alle eksemplene er tilgjengelig på GitHub.


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