--- title: Write tests with Testcontainers linkTitle: Write tests description: Write your first integration test using Testcontainers for Java and PostgreSQL. weight: 20 --- You have the `CustomerService` implementation ready, but for testing you need a PostgreSQL database. You can use Testcontainers to spin up a Postgres database in a Docker container and run your tests against it. ## Add Testcontainers dependencies Add the Testcontainers PostgreSQL module as a test dependency in `pom.xml`: ```xml org.testcontainers testcontainers-postgresql 2.0.4 test ``` Since the application uses a Postgres database, the Testcontainers Postgres module provides a `PostgreSQLContainer` class for managing the container. ## Write the test Create `CustomerServiceTest.java` under `src/test/java`: ```java package com.testcontainers.demo; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.testcontainers.postgresql.PostgreSQLContainer; class CustomerServiceTest { static PostgreSQLContainer postgres = new PostgreSQLContainer( "postgres:16-alpine" ); CustomerService customerService; @BeforeAll static void beforeAll() { postgres.start(); } @AfterAll static void afterAll() { postgres.stop(); } @BeforeEach void setUp() { DBConnectionProvider connectionProvider = new DBConnectionProvider( postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword() ); customerService = new CustomerService(connectionProvider); } @Test void shouldGetCustomers() { customerService.createCustomer(new Customer(1L, "George")); customerService.createCustomer(new Customer(2L, "John")); List customers = customerService.getAllCustomers(); assertEquals(2, customers.size()); } } ``` Here's what the test does: - Declares a `PostgreSQLContainer` with the `postgres:16-alpine` Docker image. - The `@BeforeAll` callback starts the Postgres container before any test methods run. - The `@BeforeEach` callback creates a `DBConnectionProvider` using the JDBC connection parameters from the container, then creates a `CustomerService`. The `CustomerService` constructor creates the `customers` table if it doesn't exist. - `shouldGetCustomers()` inserts 2 customer records, fetches all customers, and asserts the count. - The `@AfterAll` callback stops the container after all test methods finish.