Pengujian Integrasi Spring Boot dengan Embedded MongoDB

1. Ikhtisar

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

MongoDB adalah database dokumen NoSQL yang populer . Berkat skalabilitas tinggi, built-in sharding dan dukungan masyarakat sangat baik itu sering dianggap “ the storage NoSQL” oleh banyak pengembang.

Seperti halnya teknologi persistensi lainnya, sangat penting untuk dapat menguji integrasi database dengan aplikasi kita lainnya dengan mudah . Untungnya, Spring Boot memungkinkan kita menulis tes semacam itu dengan mudah.

2. Ketergantungan Maven

Pertama, mari kita siapkan induk Maven untuk proyek Boot kita.

Berkat induknya, kami tidak perlu menentukan versi untuk setiap dependensi Maven secara manual .

Kami secara alami akan menggunakan Spring Boot:

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

Anda dapat menemukan versi Boot terbaru di sini.

Karena kami menambahkan induk Spring Boot, kami dapat menambahkan dependensi yang diperlukan tanpa menentukan versinya:

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

spring-boot-starter-data-mongodb akan mengaktifkan dukungan Spring untuk MongoDB:

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

de.flapdoodle.embed.mongo menyediakan MongoDB yang disematkan untuk pengujian integrasi.

3. Menguji Menggunakan Embedded MongoDB

Bagian ini mencakup dua skenario: uji Spring Boot dan uji manual.

3.1. Tes Boot Musim Semi

Setelah menambahkan ketergantungan de.flapdoodle.embed.mongo, Spring Boot akan secara otomatis mencoba mengunduh dan memulai MongoDB yang disematkan saat menjalankan pengujian.

Paket hanya akan diunduh sekali untuk setiap versi sehingga pengujian selanjutnya berjalan lebih cepat.

Pada tahap ini kita harus dapat memulai dan lulus uji integrasi JUnit 5 sampel:

@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 bisa kita lihat, database yang disematkan secara otomatis dimulai oleh Spring, yang juga harus dicatat di konsol:

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

3.2. Uji Konfigurasi Manual

Spring Boot secara otomatis akan memulai dan mengkonfigurasi database yang disematkan, lalu memasukkan instance MongoTemplate untuk kita. Namun, terkadang kita mungkin perlu mengkonfigurasi database Mongo tertanam secara manual (misalnya, saat menguji versi DB tertentu).

Cuplikan berikut menunjukkan bagaimana kita dapat mengkonfigurasi instans MongoDB yang disematkan secara manual. Ini kira-kira sama dengan tes Musim Semi 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"); } }

Catatan, kita dapat dengan cepat membuat kacang MongoTemplate yang dikonfigurasi untuk menggunakan database tertanam yang dikonfigurasi secara manual dan mendaftarkannya di dalam container Spring dengan hanya membuat, misalnya, @TestConfiguration dengan metode @Bean yang akan mengembalikan MongoTemplate baru (MongoClients.create (connectionString, " test ”) .

Contoh lainnya dapat ditemukan di repositori GitHub resmi Flapdoodle.

3.3. Logging

Kita dapat mengonfigurasi pesan logging untuk MongoDB saat menjalankan tes integrasi dengan menambahkan dua properti ini ke file src / test / resources / application.propertes :

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

Misalnya, untuk menonaktifkan logging, kita cukup menyetel nilainya ke off :

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

3.4. Menggunakan Database Nyata pada Produksi

Karena kami menambahkan dependensi de.flapdoodle.embed.mongo menggunakan pengujian , tidak perlu menonaktifkan database yang disematkan saat menjalankan produksi . Yang harus kita lakukan adalah menentukan detail koneksi MongoDB (misalnya, host dan port) dan kita siap melakukannya.

Untuk menggunakan DB yang disematkan di luar pengujian, kita dapat menggunakan profil Spring yang akan mendaftarkan MongoClient yang benar (tertanam atau produksi) tergantung pada profil aktif.

Kami juga perlu mengubah cakupan ketergantungan produksi menjadi runtime .

4. Kontroversi Pengujian Tertanam

Menggunakan database yang disematkan mungkin terlihat seperti ide bagus di awal. Memang, ini adalah pendekatan yang baik ketika kami ingin menguji apakah aplikasi kami berperilaku dengan benar di area seperti:

  • Konfigurasi pemetaan ObjectDocument
  • Pemroses peristiwa siklus hidup persistensi kustom (lihat AbstractMongoEventListener )
  • Logika kode apa pun yang bekerja secara langsung dengan lapisan persistensi

Sayangnya, menggunakan server tertanam tidak dapat dianggap sebagai "pengujian integrasi penuh" . MongoDB yang disematkan Flapdoodle bukanlah produk resmi MongoDB. Oleh karena itu, kami tidak dapat memastikan bahwa ia berperilaku persis seperti di lingkungan produksi.

Jika kita ingin menjalankan pengujian komunikasi di lingkungan yang sedekat mungkin dengan produksi, solusi yang lebih baik adalah menggunakan wadah lingkungan seperti Docker.

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

5. Kesimpulan

Spring Boot membuatnya sangat mudah untuk menjalankan tes yang memverifikasi pemetaan dokumen yang tepat dan integrasi database. Dengan menambahkan dependensi Maven yang tepat, kami segera dapat menggunakan komponen MongoDB dalam pengujian integrasi Spring Boot.

Kita perlu ingat bahwa server MongoDB tertanam tidak dapat dianggap sebagai pengganti server "asli" .

Kode sumber lengkap dari semua contoh tersedia di GitHub.