Spring Boot Integration Testing med Embedded MongoDB

1. Oversigt

I denne vejledning lærer vi, hvordan du bruger Flapdoodle's integrerede MongoDB-løsning sammen med Spring Boot til at køre MongoDB-integrationstest jævnt.

MongoDB er en populær NoSQL-dokumentdatabase. Takket være den høje skalerbarhed, indbyggede sharding og fremragende community support betragtes det ofte som “det NoSQL-opbevaring ”af mange udviklere.

Som med enhver anden vedholdenhedsteknologi, det er vigtigt at være i stand til let at teste databaseintegration med resten af ​​vores applikation. Heldigvis giver Spring Boot os mulighed for let at skrive den slags test.

2. Maven-afhængigheder

Lad os først oprette Maven-forælderen til vores Boot-projekt.

Tak til forældrene vi behøver ikke at definere version for hver Maven-afhængighed manuelt.

Vi bruger naturligvis Spring Boot:

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

Du kan finde den nyeste Boot-version her.

Da vi tilføjede Spring Boot-forælder, kan vi tilføje krævede afhængigheder uden at specificere deres versioner:

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

spring-boot-starter-data-mongodb vil muliggøre forårssupport til MongoDB:

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

de.flapdoodle.embed.mongo leverer indlejret MongoDB til integrationstest.

3. Test ved hjælp af indlejret MongoDB

Dette afsnit dækker to scenarier: Spring Boot test og manuel test.

3.1. Spring Boot Test

Efter tilføjelse de.flapdoodle.embed.mongo afhængighed Spring Boot forsøger automatisk at downloade og starte den integrerede MongoDB når du kører tests.

Pakken downloades kun én gang for hver version, så efterfølgende tests kører meget hurtigere.

På dette stadium skal vi være i stand til at starte og bestå JUnit 5-integrationstesten som eksempel:

@DataMongoTest @ExtendWith (SpringExtension.class) offentlig klasse MongoDbSpringIntegrationTest {@DisplayName ("givet objekt til at gemme" + "når gem objekt med MongoDB skabelon" + "så gemmes objekt") @ Test offentlig ugyldig test (@Autowired MongoTemplate mongoTemplate) {// givet DBObject objectToSave = BasicDBObjectBuilder.start () .add ("nøgle", "værdi") .get (); // når mongoTemplate.save (objectToSave, "samling"); // derefter assertThat (mongoTemplate.findAll (DBObject.class, "collection")). udpakning ("key") .containsOnly ("value"); }}

Som vi kan se, blev den integrerede database automatisk startet af Spring, som også skulle logges i konsollen:

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

3.2. Manuel konfigurationstest

Spring Boot starter automatisk og konfigurerer den integrerede database og injiceres derefter MongoTemplate eksempel for os. Imidlertid, nogle gange kan det være nødvendigt at konfigurere den indlejrede Mongo-database manuelt (f.eks. når du tester en bestemt DB-version).

Følgende uddrag viser, hvordan vi kan konfigurere den indlejrede MongoDB-forekomst manuelt. Dette svarer stort set til den forrige forårstest:

klasse ManualEmbeddedMongoDbIntegrationTest {privat statisk endelig streng CONNECTION_STRING = "mongodb: //% s:% d"; privat MongodExecutable mongodExecutable; privat MongoTemplate mongoTemplate; @AfterEach void clean () {mongodExecutable.stop (); } @BeforeEach ugyldig opsætning () kaster undtagelse {String ip = "localhost"; int-port = 27017; IMongodConfig mongodConfig = ny MongodConfigBuilder (). Version (Version.Main.PRODUCTION) .net (nyt 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 ("givet objekt til at gemme" + "når gem objekt med MongoDB skabelon" + "så gemmes objekt") @Test ugyldig test () kaster Undtagelse {// givet DBObject objectToSave = BasicDBObjectBuilder.start (). "nøgle", "værdi") .get (); // når mongoTemplate.save (objectToSave, "samling"); // derefter assertThat (mongoTemplate.findAll (DBObject.class, "collection")). udpakning ("key") .containsOnly ("value"); }}

Bemærk, at vi hurtigt kan oprette MongoTemplate bønne konfigureret til at bruge vores manuelt konfigurerede indlejrede database og registrere den i Spring-beholderen ved blot at oprette f.eks. en @TestConfiguration med @Bønne metode, der vender tilbage nyt MongoTemplate (MongoClients.create (connectionString, “test”).

Flere eksempler kan findes på den officielle Flapdoodle's GitHub-lager.

3.3. Logning

Vi kan konfigurere logge beskeder til MongoDB, når vi kører integrationstest ved at føje disse to egenskaber til src / test / resources / application.propertes fil:

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

For eksempel, for at deaktivere logning, indstiller vi simpelthen værdierne til af:

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

3.4. Brug af en rigtig database til produktion

Siden vi tilføjede de.flapdoodle.embed.mongo afhængighed ved hjælp af prøveder er ikke behov for at deaktivere integreret database, når den kører på produktion. Alt hvad vi skal gøre er at specificere MongoDB-forbindelsesdetaljer (f.eks. Vært og port), og vi er klar til at gå.

For at bruge en integreret DB uden for test kan vi bruge Spring-profiler, der registrerer retten MongoClient (integreret eller produktion) afhængigt af den aktive profil.

Vi bliver også nødt til at ændre omfanget af produktionsafhængighed til runtime.

4. Indlejret testkontrovers

Brug af integreret database kan se ud som en god idé i starten. Faktisk er det en god tilgang, når vi vil teste, om vores ansøgning opfører sig korrekt i områder som:

  • ObjectDocument-kortlægningskonfiguration
  • Brugerdefineret vedholdenhed livscyklus begivenhedslyttere (se AbstraktMongoEventListener)
  • Logikken for enhver kode, der fungerer direkte med persistenslaget

Desværre, brug af en integreret server kan ikke betragtes som "fuld integrationstest". Flapdoodle's integrerede MongoDB er ikke et officielt MongoDB-produkt. Derfor kan vi ikke være sikre på, at den opfører sig nøjagtigt som i produktionsmiljøet.

Hvis vi vil køre kommunikationstest i miljøet så tæt på produktionen som muligt, er en bedre løsning at bruge en miljøbeholder som Docker.

For at finde ud af mere om Docker, læs vores forrige artikel her.

5. Konklusion

Spring Boot gør det ekstremt nemt at køre tests, der verificerer korrekt dokumentkortlægning og databaseintegration. Ved at tilføje den rigtige Maven-afhængighed er vi straks i stand til at bruge MongoDB-komponenter i Spring Boot-integrationstests.

Det skal vi huske integreret MongoDB-server kan ikke betragtes som en erstatning for en “rigtig” server.

Den fulde kildekode for alle eksemplerne er tilgængelig på GitHub.


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