mirror of
https://github.com/docker/docs.git
synced 2026-03-27 14:28:47 +07:00
## Description Migrate 17 Testcontainers guides from testcontainers.com into the Docker docs site, covering Java (14 guides), .NET (2 guides), and Node.js (1 guide). This follows up on PR #24450 which added the initial Go and Python guides. Each guide is converted from AsciiDoc to Hugo Markdown, split into multi-chapter stepper navigation, updated to the latest Testcontainers API, and verified with passing tests running in containers. Java guides use testcontainers-java 2.0.4 with the new 2.x Maven coordinates and package names (e.g., `testcontainers-postgresql`, `org.testcontainers.postgresql.PostgreSQLContainer`). The Quarkus guide uses Quarkus 3.22.3 with TC 1.x managed by the Quarkus BOM, since no released Quarkus version ships TC 2.x yet. ## How to test All code snippets have been verified by running each guide's source repository tests inside Docker containers with the Docker socket mounted. To re-run the verification, use the `/testcontainers-guides-migrator` skill included in this PR (`.claude/skills/testcontainers-guides-migrator/SKILL.md`). The skill's Step 6 documents the exact container commands and macOS Docker Desktop workarounds (host override, docker-java API version, etc.) needed to run each language's tests: ``` /testcontainers-guides-migrator I want you to verify all the guides in this branch. Do a full review, verifying that all code snippets compile, the code is executable, and ALL the tests pass. Run them as docker containers, never locally. ``` ## Related issues or tickets Supersedes #24450 (expanded from 2 guides to all 19) ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
167 lines
4.4 KiB
Markdown
167 lines
4.4 KiB
Markdown
---
|
|
title: Create the project and business logic
|
|
linkTitle: Create the project
|
|
description: Set up a Java project with a PostgreSQL-backed customer service for lifecycle testing.
|
|
weight: 10
|
|
---
|
|
|
|
## Set up the project
|
|
|
|
Create a Java project with Maven and add the required dependencies:
|
|
|
|
```xml
|
|
<dependencies>
|
|
<dependency>
|
|
<groupId>org.postgresql</groupId>
|
|
<artifactId>postgresql</artifactId>
|
|
<version>42.7.3</version>
|
|
</dependency>
|
|
<dependency>
|
|
<groupId>ch.qos.logback</groupId>
|
|
<artifactId>logback-classic</artifactId>
|
|
<version>1.5.6</version>
|
|
</dependency>
|
|
<dependency>
|
|
<groupId>org.junit.jupiter</groupId>
|
|
<artifactId>junit-jupiter</artifactId>
|
|
<version>5.10.2</version>
|
|
<scope>test</scope>
|
|
</dependency>
|
|
<dependency>
|
|
<groupId>org.testcontainers</groupId>
|
|
<artifactId>testcontainers-junit-jupiter</artifactId>
|
|
<version>2.0.4</version>
|
|
<scope>test</scope>
|
|
</dependency>
|
|
<dependency>
|
|
<groupId>org.testcontainers</groupId>
|
|
<artifactId>testcontainers-postgresql</artifactId>
|
|
<version>2.0.4</version>
|
|
<scope>test</scope>
|
|
</dependency>
|
|
</dependencies>
|
|
```
|
|
|
|
## Create the business logic
|
|
|
|
Create a `Customer` record:
|
|
|
|
```java
|
|
package com.testcontainers.demo;
|
|
|
|
public record Customer(Long id, String name) {}
|
|
```
|
|
|
|
Create a `CustomerService` class with methods to create, retrieve, and delete
|
|
customers:
|
|
|
|
```java
|
|
package com.testcontainers.demo;
|
|
|
|
import java.sql.Connection;
|
|
import java.sql.DriverManager;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.sql.SQLException;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Optional;
|
|
|
|
public class CustomerService {
|
|
|
|
private final String url;
|
|
private final String username;
|
|
private final String password;
|
|
|
|
public CustomerService(String url, String username, String password) {
|
|
this.url = url;
|
|
this.username = username;
|
|
this.password = password;
|
|
createCustomersTableIfNotExists();
|
|
}
|
|
|
|
public void createCustomer(Customer customer) {
|
|
try (Connection conn = this.getConnection()) {
|
|
PreparedStatement pstmt = conn.prepareStatement(
|
|
"insert into customers(id,name) values(?,?)"
|
|
);
|
|
pstmt.setLong(1, customer.id());
|
|
pstmt.setString(2, customer.name());
|
|
pstmt.execute();
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
|
|
public List<Customer> getAllCustomers() {
|
|
List<Customer> customers = new ArrayList<>();
|
|
try (Connection conn = this.getConnection()) {
|
|
PreparedStatement pstmt = conn.prepareStatement(
|
|
"select id,name from customers"
|
|
);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
long id = rs.getLong("id");
|
|
String name = rs.getString("name");
|
|
customers.add(new Customer(id, name));
|
|
}
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
return customers;
|
|
}
|
|
|
|
public Optional<Customer> getCustomer(Long customerId) {
|
|
try (Connection conn = this.getConnection()) {
|
|
PreparedStatement pstmt = conn.prepareStatement(
|
|
"select id,name from customers where id = ?"
|
|
);
|
|
pstmt.setLong(1, customerId);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
if (rs.next()) {
|
|
long id = rs.getLong("id");
|
|
String name = rs.getString("name");
|
|
return Optional.of(new Customer(id, name));
|
|
}
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
return Optional.empty();
|
|
}
|
|
|
|
public void deleteAllCustomers() {
|
|
try (Connection conn = this.getConnection()) {
|
|
PreparedStatement pstmt = conn.prepareStatement("delete from customers");
|
|
pstmt.execute();
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
|
|
private void createCustomersTableIfNotExists() {
|
|
try (Connection conn = this.getConnection()) {
|
|
PreparedStatement pstmt = conn.prepareStatement(
|
|
"""
|
|
create table if not exists customers (
|
|
id bigint not null,
|
|
name varchar not null,
|
|
primary key (id)
|
|
)
|
|
"""
|
|
);
|
|
pstmt.execute();
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
|
|
private Connection getConnection() {
|
|
try {
|
|
return DriverManager.getConnection(url, username, password);
|
|
} catch (Exception e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
}
|
|
```
|