eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (cat=Spring Boot)
announcement - icon

Refactor Java code safely — and automatically — with OpenRewrite.

Refactoring big codebases by hand is slow, risky, and easy to put off. That’s where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.

Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions — one for newcomers and one for experienced users. You’ll see how recipes work, how to apply them across projects, and how to modernize code with confidence.

Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.

Course – LJB – NPI EA (cat = Core Java)
announcement - icon

Code your way through and build up a solid, practical foundation of Java:

>> Learn Java Basics

1. Overview

In this tutorial, we’ll learn how to reuse Testcontainers when setting up the environment for local development and testing.

Firstly, we’ll have to make sure we’re not shutting down the container when the application is stopped or when the test suite finishes. After that, we’ll talk about the Testcontainerspecific configuration and we’ll discuss the benefits of using the Testcontainers Desktop application. Lastly, we need to keep in mind that reusing Testcontainers is an experimental feature and it’s not yet ready to be used in CI pipelines.

2. Ensure the Testcontainer Isn’t Stopped

A straightforward way of enabling Testcontainers for our unit tests is to leverage their dedicated JUnit 5 extension through the @Testcontainers and @Container annotations.

Let’s write a test that starts a Spring Boot application and allows it to connect to a MongoDB database running in a Docker container:

@Testcontainers
@SpringBootTest
class ReusableContainersLiveTest {

    @Container
    static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"));
  
    // dynamic properties and test cases
}

However, the Testcontainer’s JUnit5 Extension that automatically spins up MongoDBContainer will also shuts it down after the tests. Therefore, let’s remove the @Testcontainers and @Container annotations, and manually start the container instead:

@SpringBootTest
class ReusableContainersLiveTest {
   static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"));

    @BeforeAll
    static void beforeAll() {
        mongoDBContainer.start();
    }
    
    // dynamic properties and test cases
}

On the other hand, we might be using Spring Boot’s built-in support for Testcontainers during local development. In this context, we won’t use the JUnit 5 extension and this step is unnecessary.

3. Manage the Testcontainer Lifecycle

Now, we can be in full control of the container’s lifecycle. We can configure the application to reuse an existing Testcontainer and we can manually stop it from the terminal.

3.1. The withReuse() Method

We can mark a Testcontainer as reusable by using the withReuse() method of its fluent API:

static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"))
  .withReuse(true);

When we run the test for the first time, we’ll see the usual Testcontainers logs about starting the MongoDBContainer. This usually takes a few seconds:

23:56:42.383 [main] INFO tc.mongo:4.0.10 - Creating container for image: mongo:4.0.10
23:56:42.892 [main] INFO tc.mongo:4.0.10 - Container mongo:4.0.10 is starting: d5fa298bf6...
23:56:45.470 [main] INFO tc.mongo:4.0.10 - Container mongo:4.0.10 started in PT3.11239S

After the test finishes, we should be able to see the container still running. For example, we can check from the terminal using the docker ps command:

Reusing Testcontainers

 

Furthermore, when we re-run the test, the container will be reused as long as the configuration isn’t changed. As a result, the container set-up time noticeably decreases:

00:12:23.859 [main] INFO tc.mongo:4.0.10 - Creating container for image: mongo:4.0.10
00:12:24.190 [main] INFO tc.mongo:4.0.10 - Reusing container with ID: d5fa298b... and hash: 0702144b...
00:12:24.191 [main] INFO tc.mongo:4.0.10 - Reusing existing container (d5fa298b...) and not creating a new one
00:12:24.398 [main] INFO tc.mongo:4.0.10 - Container mongo:4.0.10 started in PT0.5555088S

Lastly, the reused database contains previously inserted documents. Although this might be useful for local development, it may be harmful for testing. If we need to start fresh, we can simply clear the collection before each test.

3.2. Testcontainers Configuration

In some cases, a warning may occur, stating that “Reuse was requested but the environment doesn’t support the reuse of containers”. This happens when the reuse is disabled on our local Testcontainers configuration:

00:23:09.461 [main] INFO tc.mongo:4.0.10 - Creating container for image: mongo:4.0.10
00:23:09.463 [main] WARN tc.mongo:4.0.10 - Reuse was requested but the environment does not support the reuse of containers
To enable reuse of containers, you must set 'testcontainers.reuse.enable=true' in a file located at C:\Users\Emanuel Trandafir\.testcontainers.properties
00:23:09.544 [main] INFO tc.mongo:4.0.10 - Container mongo:4.0.10 is starting: 903dd52d7...

To fix it, we can simply edit the .testcontainers.properties file and set reuse as enabled:

 

Enable TC Reuse from Properties

3.3. Stopping the Container

We can manually stop the Docker container whenever we want, from the terminal. To do so, we only need to run the docker stop command, followed by the container ID. Future executions of the application spin up a new Docker container.

4. Testcontainers Desktop

We can install the Testcontainer Desktop application to easily manage the lifecycle and configuration of our Testcontainers.

The application requires authentication, but we can easily log in using a GitHub account. After signing in, we’ll see the Testcontainers icon in the toolbar. If we click on it, we’ll have a few options to choose from:

 

Testcontainers

Now, executing the previously demonstrated steps is as effortless as the click of a button. For instance, we can enable or disable reusable containers with ease via Preferences > Enable reusable containers. Furthermore, we have the capability to terminate the containers or freeze them before the shutdown, if more debugging is needed.

5. Conclusion

In this article, we’ve learned how to reuse Testcontainers in Java. We discovered that JUnit 5 might try to shut down the container before finishing the execution. We avoided this by manually starting the containers instead of relying on the Testcontainers’ JUnit 5 extension.

After that, we discussed the withReuse() method and other Testcontainer-specific configurations. Finally, we installed the Testcontainers Desktop application, and we saw how it can be a valuable asset for double-checking configurations when it comes to managing the Testcontainers’ lifecycle.

The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.
Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (tag=Refactoring)
announcement - icon

Modern Java teams move fast — but codebases don’t always keep up. Frameworks change, dependencies drift, and tech debt builds until it starts to drag on delivery. OpenRewrite was built to fix that: an open-source refactoring engine that automates repetitive code changes while keeping developer intent intact.

The monthly training series, led by the creators and maintainers of OpenRewrite at Moderne, walks through real-world migrations and modernization patterns. Whether you’re new to recipes or ready to write your own, you’ll learn practical ways to refactor safely and at scale.

If you’ve ever wished refactoring felt as natural — and as fast — as writing code, this is a good place to start.

eBook Jackson – NPI EA – 3 (cat = Jackson)
2 Comments
Oldest
Newest
Inline Feedbacks
View all comments