1。概要
このチュートリアルでは、Flapdoodleの組み込みMongoDBソリューションをSpring Bootと一緒に使用して、MongoDB統合テストをスムーズに実行する方法を学習します。
MongoDBは人気のあるNoSQLドキュメントデータベースです 。高いスケーラビリティ、組み込みのシャーディング、優れたコミュニティサポートのおかげで、「」と見なされることがよくあります。 多くの開発者による「NoSQLストレージ」。
他の永続化テクノロジーと同様に、データベースと他のアプリケーションとの統合を簡単にテストできることが重要です 。ありがたいことに、Spring Bootを使用すると、そのようなテストを簡単に作成できます。
2。 Mavenの依存関係
まず、BootプロジェクトのMaven親を設定しましょう。
親のおかげで、各Maven依存関係のバージョンを手動で定義する必要はありません 。
当然、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>
最新のブートバージョンはここにあります。
Spring Bootの親を追加したので、バージョンを指定せずに必要な依存関係を追加できます。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring-boot-starter-data-mongodb MongoDBのSpringサポートを有効にします:
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<scope>test</scope>
</dependency>
de.flapdoodle.embed.mongo 統合テスト用の組み込みMongoDBを提供します。
3。 EmbeddedMongoDBを使用したテスト
このセクションでは、SpringBootテストと手動テストの2つのシナリオについて説明します。
3.1。春のブートテスト
de.flapdoodle.embed.mongoを追加した後 依存関係SpringBootは、埋め込まれたMongoDBを自動的にダウンロードして起動しようとします テストを実行するとき。
パッケージはバージョンごとに1回だけダウンロードされるため、後続のテストははるかに高速に実行されます。
この段階で、サンプルのJUnit5統合テストを開始して合格できるはずです。
@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");
}
}
ご覧のとおり、組み込みデータベースはSpringによって自動的に開始され、コンソールにもログインする必要があります。
...Starting MongodbExampleApplicationTests on arroyo with PID 10413...
3.2。手動構成テスト
Spring Bootは、組み込みデータベースを自動的に起動して構成し、 MongoTemplateを挿入します。 私たちのためのインスタンス。ただし、組み込みのMongoデータベースを手動で構成する必要がある場合があります (たとえば、特定のDBバージョンをテストする場合)。
次のスニペットは、組み込みのMongoDBインスタンスを手動で構成する方法を示しています。これは、前の春のテストとほぼ同じです:
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");
}
}
MongoTemplateをすばやく作成できることに注意してください 手動で構成された組み込みデータベースを使用し、 @TestConfiguration などを作成するだけで、Springコンテナー内に登録するように構成されたBean @Beanを使用 new MongoTemplate(MongoClients.create(connectionString、“ test”)を返すメソッド 。
その他の例は、Flapdoodleの公式GitHubリポジトリにあります。
3.3。ロギング
これらの2つのプロパティをsrc/ test / resources / application.propertes に追加することで、統合テストの実行時にMongoDBのログメッセージを構成できます。 ファイル:
logging.level.org.springframework.boot.autoconfigure.mongo.embedded
logging.level.org.mongodb
たとえば、ロギングを無効にするには、値を offに設定するだけです。 :
logging.level.org.springframework.boot.autoconfigure.mongo.embedded=off
logging.level.org.mongodb=off
3.4。本番環境での実際のデータベースの使用
de.flapdoodle.embed.mongoを追加したので
テスト以外で組み込みDBを使用するには、適切な MongoClientを登録するSpringプロファイルを使用できます。 (埋め込みまたは本番)アクティブなプロファイルによって異なります。
また、本番環境の依存関係のスコープを
4。埋め込みテストの論争
組み込みデータベースを使用することは、最初は素晴らしいアイデアのように思えるかもしれません。実際、次のような領域でアプリケーションが正しく動作するかどうかをテストする場合は、これは良いアプローチです。
- オブジェクト<->ドキュメントマッピング構成
- カスタム永続性ライフサイクルイベントリスナー( AbstractMongoEventListener を参照) )
- 永続化レイヤーと直接連携するコードのロジック
残念ながら、組み込みサーバーの使用は「完全統合テスト」とは見なされません 。 Flapdoodleに組み込まれているMongoDBは、公式のMongoDB製品ではありません。したがって、本番環境とまったく同じように動作するかどうかはわかりません。
本番環境にできるだけ近い環境で通信テストを実行する場合は、Dockerなどの環境コンテナーを使用することをお勧めします。
Dockerの詳細については、こちらの以前の記事をご覧ください。