1. Ikhtisar
Dalam tutorial ini, kita akan belajar bagaimana menggunakan solusi MongoDB Flapdoodle yang disematkan bersama dengan Spring Boot untuk menjalankan tes integrasi MongoDB dengan lancar.
MongoDB adalah database dokumen NoSQL yang populer . Berkat skalabilitas tinggi, sharding bawaan, dan dukungan komunitas yang sangat baik, sering kali dianggap sebagai “the Penyimpanan NoSQL” oleh banyak pengembang.
Seperti halnya teknologi persistensi lainnya, sangat penting untuk dapat menguji integrasi database dengan aplikasi kita yang lain dengan mudah . Untungnya, Spring Boot memungkinkan kita untuk menulis tes semacam itu dengan mudah.
2. Ketergantungan Maven
Pertama, mari siapkan induk Maven untuk proyek Boot kita.
Terima kasih kepada induk kami tidak perlu mendefinisikan versi untuk setiap ketergantungan Maven secara manual .
Kami secara alami akan menggunakan Spring Boot:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
Anda dapat menemukan versi Boot terbaru di sini.
Karena kami menambahkan induk Spring Boot, kami dapat menambahkan dependensi yang diperlukan tanpa menentukan versinya:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring-boot-starter-data-mongodb akan mengaktifkan dukungan Spring untuk MongoDB:
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<scope>test</scope>
</dependency>
de.flapdoodle.embed.mongo menyediakan MongoDB tertanam untuk pengujian integrasi.
3. Uji Menggunakan MongoDB Tersemat
Bagian ini mencakup dua skenario:uji Spring Boot dan uji manual.
3.1. Tes Boot Musim Semi
Setelah menambahkan de.flapdoodle.embed.mongo ketergantungan Boot Musim Semi 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 sampel 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 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 akan secara otomatis memulai dan mengonfigurasi basis data tertanam dan kemudian menyuntikkan MongoTemplate contoh bagi kita. Namun, terkadang kita mungkin perlu mengonfigurasi basis data Mongo yang disematkan secara manual (mis., saat menguji versi DB tertentu).
Cuplikan berikut menunjukkan bagaimana kita dapat mengonfigurasi instance MongoDB yang disematkan secara manual. Ini kira-kira setara 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;
ImmutableMongodConfig mongodConfig = MongodConfig
.builder()
.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, bahwa kita dapat dengan cepat membuat MongoTemplate bean dikonfigurasi untuk menggunakan database tertanam kami yang dikonfigurasi secara manual dan mendaftarkannya di dalam wadah Spring hanya dengan membuat, mis., @TestConfiguration dengan @Bean metode yang akan mengembalikan MongoTemplate(MongoClients.create(connectionString, “test”) baru .
Contoh lainnya dapat ditemukan di repositori GitHub resmi Flappdoodle.
3.3. Masuk
Kita dapat mengonfigurasi pesan logging untuk MongoDB saat menjalankan tes integrasi dengan menambahkan dua properti ini ke src/test/resources/application.propertes berkas:
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 Basis Data Nyata pada Produksi
Karena kami menambahkan de.flapdoodle.embed.mongo ketergantungan menggunakan
Untuk menggunakan DB tertanam di luar pengujian, kita dapat menggunakan profil Spring yang akan mendaftarkan MongoClient yang tepat (tersemat atau produksi) tergantung pada profil aktif.
Kita juga perlu mengubah cakupan ketergantungan produksi ke
4. Kontroversi Pengujian Tertanam
Menggunakan basis data tertanam mungkin terlihat seperti ide bagus di awal. Memang, ini adalah pendekatan yang baik ketika kita ingin menguji apakah aplikasi kita berperilaku dengan benar di area seperti:
- Objek<->Konfigurasi pemetaan dokumen
- Pemroses peristiwa siklus hidup persistensi khusus (lihat AbstractMongoEventListener )
- Logika dari setiap kode yang bekerja secara langsung dengan lapisan persistensi
Sayangnya, menggunakan server tertanam tidak dapat dianggap sebagai "pengujian integrasi penuh" . MongoDB tertanam Flapdoodle bukanlah produk MongoDB resmi. Oleh karena itu, kami tidak dapat memastikan bahwa ia berperilaku persis seperti di lingkungan produksi.
Jika kita ingin menjalankan tes komunikasi di lingkungan 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.