Ujian Integrasi Spring Boot dengan MongoDB Tertanam

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan belajar bagaimana menggunakan penyelesaian MongoDB tertanam Flapdoodle bersama dengan Spring Boot untuk menjalankan ujian integrasi MongoDB dengan lancar.

MongoDB adalah pangkalan data dokumen NoSQL yang popular . Terima kasih kepada berskala tinggi, terbina dalam sharding dan sokongan masyarakat yang cemerlang ia sering dianggap " yang simpanan NoSQL" oleh banyak pemaju.

Seperti teknologi ketekunan lain, sangat penting untuk dapat menguji integrasi pangkalan data dengan aplikasi kami yang lain dengan mudah . Syukurlah, Spring Boot membolehkan kami menulis ujian semacam itu dengan mudah.

2. Pergantungan Maven

Pertama, mari sediakan ibu bapa Maven untuk projek Boot kami.

Terima kasih kepada ibu bapa kami tidak perlu menentukan versi untuk setiap kebergantungan Maven secara manual .

Kami secara semula jadi akan menggunakan Spring Boot:

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

Anda boleh mendapatkan versi Boot terkini di sini.

Oleh kerana kami menambah ibu bapa Spring Boot, kami dapat menambahkan kebergantungan yang diperlukan tanpa menentukan versi mereka:

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

spring-boot-starter-data-mongodb akan membolehkan sokongan Spring untuk MongoDB:

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

de.flapdoodle.embed.mongo menyediakan MongoDB tertanam untuk ujian integrasi.

3. Uji Menggunakan MongoDB Tertanam

Bahagian ini merangkumi dua senario: ujian Spring Boot dan ujian manual.

3.1. Ujian Boot Musim Bunga

Setelah menambahkan pergantungan de.flapdoodle.embed.mongo Spring Boot secara automatik akan cuba memuat turun dan memulakan MongoDB terbenam semasa menjalankan ujian.

Pakej akan dimuat turun sekali sahaja untuk setiap versi supaya ujian seterusnya berjalan lebih cepat.

Pada tahap ini kita seharusnya dapat memulakan dan lulus sampel ujian integrasi JUnit 5:

@DataMongoTest @ExtendWith(SpringExtension.class) public class MongoDbSpringIntegrationTest { @DisplayName("given object to save" + " when save object using MongoDB template" + " then object is saved") @Test public void test(@Autowired MongoTemplate mongoTemplate) { // given DBObject objectToSave = BasicDBObjectBuilder.start() .add("key", "value") .get(); // when mongoTemplate.save(objectToSave, "collection"); // then assertThat(mongoTemplate.findAll(DBObject.class, "collection")).extracting("key") .containsOnly("value"); } }

Seperti yang dapat kita lihat, pangkalan data terbenam dimulakan secara automatik oleh Spring, yang juga harus dilog masuk di konsol:

...Starting MongodbExampleApplicationTests on arroyo with PID 10413...

3.2. Ujian Konfigurasi Manual

Spring Boot secara automatik akan memulakan dan mengkonfigurasi pangkalan data terbenam dan kemudian memasukkan contoh MongoTemplate untuk kita. Namun, kadang-kadang kita mungkin perlu mengkonfigurasi pangkalan data Mongo tertanam secara manual (misalnya, ketika menguji versi DB tertentu).

Coretan berikut menunjukkan bagaimana kita dapat mengkonfigurasi instance MongoDB yang tersemat secara manual. Ini kira-kira setara dengan ujian Spring sebelumnya:

class ManualEmbeddedMongoDbIntegrationTest { private static final String CONNECTION_STRING = "mongodb://%s:%d"; private MongodExecutable mongodExecutable; private MongoTemplate mongoTemplate; @AfterEach void clean() { mongodExecutable.stop(); } @BeforeEach void setup() throws Exception { String ip = "localhost"; int port = 27017; IMongodConfig mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION) .net(new Net(ip, port, Network.localhostIsIPv6())) .build(); MongodStarter starter = MongodStarter.getDefaultInstance(); mongodExecutable = starter.prepare(mongodConfig); mongodExecutable.start(); mongoTemplate = new MongoTemplate(MongoClients.create(String.format(CONNECTION_STRING, ip, port)), "test"); } @DisplayName("given object to save" + " when save object using MongoDB template" + " then object is saved") @Test void test() throws Exception { // given DBObject objectToSave = BasicDBObjectBuilder.start() .add("key", "value") .get(); // when mongoTemplate.save(objectToSave, "collection"); // then assertThat(mongoTemplate.findAll(DBObject.class, "collection")).extracting("key") .containsOnly("value"); } }

Perhatikan, bahawa kita dapat dengan cepat membuat kacang MongoTemplate yang dikonfigurasikan untuk menggunakan pangkalan data tertanam yang dikonfigurasi secara manual dan mendaftarkannya di dalam wadah Spring dengan hanya membuat, misalnya, kaedah @TestConfiguration with @Bean yang akan mengembalikan MongoTemplate baru (MongoClients.create (connectionString, “ ujian ”) .

Lebih banyak contoh boleh didapati di repositori Flapdoodle's GitHub rasmi.

3.3. Pembalakan

Kami dapat mengkonfigurasi mesej log untuk MongoDB ketika menjalankan ujian integrasi dengan menambahkan dua sifat ini ke fail src / test / resources / application.propertes :

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

Sebagai contoh, untuk melumpuhkan pembalakan, kita hanya mematikan nilai :

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

3.4. Menggunakan Pangkalan Data Sebenar mengenai Pengeluaran

Oleh kerana kami menambahkan kebergantungan de.flapdoodle.embed.mongo menggunakan ujian , tidak perlu menonaktifkan pangkalan data terbenam ketika menjalankan pengeluaran . Yang harus kita lakukan adalah menentukan butiran sambungan MongoDB (contohnya, host dan port) dan kita masih baik.

Untuk menggunakan DB tertanam di luar ujian, kita dapat menggunakan profil Spring yang akan mendaftarkan MongoClient (tertanam atau produksi) yang tepat bergantung pada profil aktif.

Kita juga perlu mengubah skop pergantungan pengeluaran untuk runtime .

4. Kontroversi Ujian Terbenam

Menggunakan pangkalan data terbenam mungkin kelihatan seperti idea hebat pada awalnya. Memang, ini adalah pendekatan yang baik ketika kita ingin menguji apakah aplikasi kita berkelakuan betul di bidang seperti:

  • Konfigurasi pemetaan ObjectDocument
  • Pendengar peristiwa kitaran hayat kegigihan tersuai (rujuk AbstractMongoEventListener )
  • Logik kod yang berfungsi secara langsung dengan lapisan kegigihan

Sayangnya, menggunakan pelayan terbenam tidak boleh dianggap sebagai "pengujian integrasi penuh" . MongoDB yang disematkan oleh Flapdoodle bukanlah produk rasmi MongoDB. Oleh itu, kita tidak dapat memastikan bahawa ia berkelakuan sama seperti di persekitaran pengeluaran.

Sekiranya kita ingin menjalankan ujian komunikasi di persekitaran sedekat mungkin dengan produksi, penyelesaian yang lebih baik adalah menggunakan wadah persekitaran seperti Docker.

Untuk mengetahui lebih lanjut mengenai Docker, baca artikel kami sebelumnya di sini.

5. Kesimpulan

Spring Boot menjadikannya sangat mudah untuk menjalankan ujian yang mengesahkan pemetaan dokumen dan integrasi pangkalan data yang betul. Dengan menambahkan kebergantungan Maven yang betul, kita segera dapat menggunakan komponen MongoDB dalam ujian integrasi Spring Boot.

Kita perlu ingat bahawa pelayan MongoDB yang tertanam tidak boleh dianggap sebagai pengganti pelayan "nyata" .

Kod sumber lengkap dari semua contoh boleh didapati di GitHub.