MongoDB.local SF, Jan 15: See the speaker lineup & ship your AI vision faster. Use WEB50 to save 50%
Find out more >
Docs Menu
Docs Home
/ /

テストコンテナを使用したJavaとMongoDBによる統合テスト

Testcontainers は、統合テストを簡素化するためにDockerコンテナを使用するJavaライブラリです。テスト中に実行される一時的なデータベースインスタンスを作成し、テストが終了すると自動的に削除します。

このチュートリアルでは、標準Javaと SPI アプリケーションの両方でMongoDBと Testcontainer を使用する方法を説明します。

統合テストは、アプリケーションのさまざまな部分がどのように連携するかをチェックします。個々のコード部分を検証するユニットテストとは異なり、統合テストは、コードがデータベースやAPIなどの外部システムと正しくやり取りされることを確認します。

テストコンテナは、テストを実行中ときに次の手順を実行します。

  1. テストの前:コンテナを作成し、データベースをロードし、 コレクションを作成します

  2. テスト中: テスト コードを実行します

  3. テスト後:コンテナを削除し、リソースを解放します

Testcontainer を使用するテストは、どのコンピューターやオペレーティング システムでも同じ方法で実行され、各テストは独自のデータベースインスタンスを使用します。必要に応じて、異なるデータベースのバージョンを切り替えることもできます。

始める前に、以下をインストールしてください。

  • Javaバージョン22 。ダウンロードするには、 Oracle のウェブサイト を参照してください。

  • Maven バージョン3.9.6 。ダウンロードするには Maven のウェブサイト を参照してください。

  • Dockerバージョン26.0.0 。ダウンロードするには、 Docker のウェブサイト を参照してください。

次の依存関係もアプリケーションの pom.xmlファイルに追加する必要があります。

<dependencyManagement>
<dependencies>
<!-- MongoDB Java Driver BOM -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-bom</artifactId>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Testcontainers BOM -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-bom</artifactId>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- JUnit BOM -->
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

次の例では、 IMDb の評価が7.0 を超える映画を検索するクエリをテストしています。完全なコードを表示するには、 GitHubリポジトリ を参照してください。

1

次のコードでは、 MongoDBコンテナが作成されます。 @Container アノテーションにより、テストの前にコンテナが起動され、テストの完了後にコンテナが停止します。

@Container
private static final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:7.0.0");
2

次のコードはコンテナに接続し、サンプル映画を追加します。

@BeforeAll
public void setup() {
String uri = mongoDBContainer.getConnectionString();
mongoClient = MongoClients.create(uri);
database = mongoClient.getDatabase("testdb");
collection = database.getCollection("testCollection");
// Insert sample data
Document doc1 = new Document("title", "Inception").append("imdb", new Document("rating", 8.8));
Document doc2 = new Document("title", "The Room").append("imdb", new Document("rating", 3.7));
Document doc3 = new Document("title", "The Dark Knight").append("imdb", new Document("rating", 9.0));
collection.insertMany(List.of(doc1, doc2, doc3));
}
3

次のコードでは、imdb.ratingフィールドの値が 7 より大きい映画に対してクエリを実行し、結果を確認します。

@Test
void testMoviesWithHighRating() {
List<Document> resultDocuments = new ArrayList<>();
try (MongoCursor<Document> cursor = collection.find(Filters.gt("imdb.rating", 7))
.projection(new Document("title", 1).append("_id", 0))
.iterator()) {
while (cursor.hasNext()) {
Document doc = cursor.next();
System.out.println(doc.toJson());
resultDocuments.add(doc);
}
}
assertEquals(2, resultDocuments.size());
for (Document doc : resultDocuments) {
assertTrue(doc.containsKey("title"));
assertFalse(doc.containsKey("_id"));
}
}

このテストでは、次の項目を確認します。

  • クエリは完全に 2 ドキュメントを返します

  • 各ドキュメントには titleフィールドがあります

  • 各ドキュメントには _idフィールドが除外されます

次の例では、spring Upstart MongoDB Aggregationsリポジトリのコードを使用して findAll()メソッドをテストします。

1

次のコードでは、 MongoDBコンテナを作成します。

@Container
public static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:7.0.0"));
2

次のコードでは、テストデータベースを使用するようにspringが起動するように構成します。

@DynamicPropertySource
static void setProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
registry.add("spring.data.mongodb.database", () -> "testdb");
}
@BeforeAll
public static void setUpAll() {
String mongoUri = mongoDBContainer.getConnectionString();
mongoClient = MongoClients.create(mongoUri);
}
@BeforeEach
public void setUp() {
salesRepository.save(createMockSales());
}
private Sales createMockSales() {
Item item1 = new Item("Item1", Arrays.asList("Tag1", "Tag2"), new BigDecimal("19.99"), 2);
Item item2 = new Item("Item2", Arrays.asList("Tag3", "Tag4"), new BigDecimal("29.99"), 1);
List<Item> items = Arrays.asList(item1, item2);
Customer customer = new Customer("Male", 30, "customer@example.com", 5);
return new Sales(new ObjectId(), new Date(), items, "Store1", customer, true, "Online");
}
3

次のコードは、findAll() メソッドをテストします。

@Test
public void testFindAll() {
List<Sales> salesList = salesRepository.findAll();
assertThat(salesList).isNotEmpty();
assertThat(salesList.size()).isEqualTo(1);
Sales sales = salesList.get(0);
assertThat(sales.getStoreLocation()).isEqualTo("Store1");
assertThat(sales.getCustomer().getEmail()).isEqualTo("customer@example.com");
assertThat(sales.getItems()).hasSize(2);
}

このテストでは、次の項目を確認します。

  • クエリは完全に 2 ドキュメントを返します

  • 各ドキュメントには titleフィールドがあります

  • 各ドキュメントには _idフィールドが除外されます

戻る

Cluster とMongoDB

項目一覧