Spring Boot-integratietest met ingesloten MongoDB

1. Overzicht

In deze tutorial leren we hoe we Flapdoodle's embedded MongoDB-oplossing samen met Spring Boot kunnen gebruiken om MongoDB-integratietests soepel uit te voeren.

MongoDB is een populaire NoSQL-documentdatabase. Dankzij de hoge schaalbaarheid, ingebouwde sharding en uitstekende communityondersteuning wordt het vaak beschouwd als "de NoSQL-opslag ”door veel ontwikkelaars.

Net als bij elke andere persistentietechnologie, het is van cruciaal belang om de database-integratie met de rest van onze applicatie eenvoudig te kunnen testen. Gelukkig stelt Spring Boot ons in staat om dat soort tests gemakkelijk te schrijven.

2. Maven afhankelijkheden

Laten we eerst de Maven-ouder instellen voor ons Boot-project.

Met dank aan de ouder we hoeven de versie voor elke Maven-afhankelijkheid niet handmatig te definiëren.

We gaan natuurlijk Spring Boot gebruiken:

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

Je kunt de laatste Boot-versie hier vinden.

Omdat we Spring Boot-ouder hebben toegevoegd, kunnen we vereiste afhankelijkheden toevoegen zonder hun versies op te geven:

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

spring-boot-starter-data-mongodb zal Spring-ondersteuning voor MongoDB inschakelen:

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

de.flapdoodle.embed.mongo biedt ingebedde MongoDB voor integratietests.

3. Test met ingebedde MongoDB

Dit gedeelte behandelt twee scenario's: Spring Boot-test en handmatige test.

3.1. Spring Boot Test

Na het toevoegen de.flapdoodle.embed.mongo afhankelijkheid Spring Boot zal automatisch proberen de ingesloten MongoDB te downloaden en te starten bij het uitvoeren van tests.

Het pakket wordt voor elke versie slechts één keer gedownload, zodat de volgende tests veel sneller verlopen.

In dit stadium zouden we in staat moeten zijn om de voorbeeld JUnit 5-integratietest te starten en te doorstaan:

@DataMongoTest @ExtendWith (SpringExtension.class) openbare klasse MongoDbSpringIntegrationTest {@DisplayName ("gegeven object om op te slaan" + "bij opslaan van object met MongoDB-sjabloon" + "dan object wordt opgeslagen") @Test openbare ongeldige test (@Autowired MongoTemplate mongoTemplate) {// gegeven DBObject objectToSave = BasicDBObjectBuilder.start () .add ("sleutel", "waarde") .get (); // when mongoTemplate.save (objectToSave, "collection"); // dan assertThat (mongoTemplate.findAll (DBObject.class, "collection")). extracting ("key") .containsOnly ("value"); }}

Zoals we kunnen zien, werd de ingesloten database automatisch gestart door Spring, die ook in de console zou moeten worden geregistreerd:

... MongodbExampleApplicationTests starten op arroyo met PID 10413 ...

3.2. Handmatige configuratietest

Spring Boot zal automatisch starten en de embedded database configureren en dan injecteren MongoTemplate bijvoorbeeld voor ons. Echter, soms moeten we de ingesloten Mongo-database handmatig configureren (bijv. bij het testen van een specifieke DB-versie).

Het volgende fragment laat zien hoe we de ingesloten MongoDB-instantie handmatig kunnen configureren. Dit is ongeveer het equivalent van de vorige Spring-test:

klasse ManualEmbeddedMongoDbIntegrationTest {privé statische laatste String CONNECTION_STRING = "mongodb: //% s:% d"; privé MongodExecutable mongodExecutable; privé MongoTemplate mongoTemplate; @AfterEach void clean () {mongodExecutable.stop (); } @BeforeEach void setup () gooit uitzondering {String ip = "localhost"; int poort = 27017; IMongodConfig mongodConfig = nieuwe MongodConfigBuilder (). Versie (Version.Main.PRODUCTION) .net (nieuw Net (ip, poort, Network.localhostIsIPv6 ())) .build (); MongodStarter-starter = MongodStarter.getDefaultInstance (); mongodExecutable = starter.prepare (mongodConfig); mongodExecutable.start (); mongoTemplate = nieuwe MongoTemplate (MongoClients.create (String.format (CONNECTION_STRING, ip, poort)), "test"); } @DisplayName ("gegeven object om op te slaan" + "wanneer object wordt opgeslagen met MongoDB-sjabloon" + "dan wordt object opgeslagen") @Test void test () genereert uitzondering {// gegeven DBObject objectToSave = BasicDBObjectBuilder.start () .add ( "sleutel", "waarde") .get (); // when mongoTemplate.save (objectToSave, "collection"); // dan assertThat (mongoTemplate.findAll (DBObject.class, "collection")). extracting ("key") .containsOnly ("value"); }}

Merk op dat we snel kunnen creëren MongoTemplate bean geconfigureerd om onze handmatig geconfigureerde embedded database te gebruiken en deze in de Spring-container te registreren door simpelweg een @TestConfiguration met @Boon methode die zal terugkeren nieuwe MongoTemplate (MongoClients.create (connectionString, "test").

Meer voorbeelden zijn te vinden in de officiële Flapdoodle's GitHub-repository.

3.3. Logboekregistratie

We kunnen logboekberichten configureren voor MongoDB bij het uitvoeren van integratietests door deze twee eigenschappen toe te voegen aan src / test / resources / application.propertes het dossier:

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

Om logboekregistratie bijvoorbeeld uit te schakelen, stellen we de waarden eenvoudig in op uit:

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

3.4. Een echte database gebruiken voor productie

Sinds we hebben toegevoegd de.flapdoodle.embed.mongo afhankelijkheid met testhet is niet nodig om de embedded database uit te schakelen wanneer deze in productie is. Het enige wat we hoeven te doen is MongoDB-verbindingsdetails specificeren (bijv. Host en poort) en we zijn klaar om te gaan.

Om een ​​embedded DB buiten tests te gebruiken, kunnen we Spring-profielen gebruiken die het recht zullen registreren MongoClient (embedded of productie) afhankelijk van het actieve profiel.

We zullen ook de reikwijdte van de productieafhankelijkheid moeten wijzigen in looptijd.

4. Controverse over ingebedde tests

Het gebruik van een ingesloten database lijkt in het begin misschien een goed idee. Het is inderdaad een goede benadering als we willen testen of onze applicatie zich correct gedraagt ​​op gebieden zoals:

  • Configuratie van ObjectDocument-toewijzing
  • Aangepaste levenscyclusgebeurtenislisteners voor persistentie (raadpleeg AbstractMongoEventListener)
  • De logica van elke code die rechtstreeks met de persistentielaag werkt

Helaas, het gebruik van een ingesloten server kan niet worden beschouwd als 'volledige integratietest'. De ingebouwde MongoDB van Flapdoodle is geen officieel MongoDB-product. Daarom kunnen we er niet zeker van zijn dat het zich precies gedraagt ​​als in de productieomgeving.

Willen we communicatietesten in de omgeving zo dicht mogelijk bij de productie draaien, dan is een betere oplossing het gebruik van een omgevingscontainer zoals Docker.

Lees hier ons vorige artikel voor meer informatie over Docker.

5. Conclusie

Spring Boot maakt het uiterst eenvoudig om tests uit te voeren die de juiste documenttoewijzing en database-integratie verifiëren. Door de juiste Maven-afhankelijkheid toe te voegen, kunnen we onmiddellijk MongoDB-componenten gebruiken in Spring Boot-integratietests.

Dat moeten we onthouden ingesloten MongoDB-server kan niet worden beschouwd als een vervanging voor een "echte" server.

De volledige broncode van alle voorbeelden is beschikbaar op GitHub.


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