Document methods of starting Testcontainer containers
Update the reference documentation to provide more details about the three supported methods of starting Testcontainer containers. See gh-44187 Signed-off-by: Vanio Begic <vanio.begic123@gmail.com>
This commit is contained in:
committed by
Phillip Webb
parent
2f242cad50
commit
4a98b1787f
@@ -5,13 +5,89 @@ The https://www.testcontainers.org/[Testcontainers] library provides a way to ma
|
||||
It integrates with JUnit, allowing you to write a test class that can start up a container before any of the tests run.
|
||||
Testcontainers is especially useful for writing integration tests that talk to a real backend service such as MySQL, MongoDB, Cassandra and others.
|
||||
|
||||
In following sections we will describe some of the methods you can use to integrate Testcontainers with your tests.
|
||||
|
||||
|
||||
|
||||
[[testing.testcontainers.via-junit-extension]]
|
||||
== Using via @Testcontainers JUnit5 extension
|
||||
|
||||
The Testcontainers provides JUnit5 extensions, which can be used to manage containers in your tests.
|
||||
The extension is activated by applying the `@Testcontainers` annotation from Testcontainers to your test class.
|
||||
|
||||
Testcontainers can be used in a Spring Boot test as follows:
|
||||
|
||||
include-code::vanilla/MyIntegrationTests[]
|
||||
|
||||
This will start up a docker container running Neo4j (if Docker is running locally) before any of the tests are run.
|
||||
This will start up a Docker container running Neo4j (if Docker is running locally) before any of the tests are run.
|
||||
In most cases, you will need to configure the application to connect to the service running in the container.
|
||||
|
||||
In this case the lifecycle of the container instance is managed by Testcontainers, as described in official documentation.
|
||||
|
||||
|
||||
[[testing.testcontainers.via-spring-beans]]
|
||||
== Using via Spring managed beans
|
||||
|
||||
The containers provided by Testcontainers can be managed by Spring Boot as beans.
|
||||
This method of managing contains can be used in combination with javadoc:org.springframework.boot.testcontainers.service.connection.ServiceConnection[format=annotation].
|
||||
|
||||
To use Testcontainer contains as Spring beans we need to create a configuration class declaring the container as bean:
|
||||
|
||||
include-code::beandeclaration/BeanDeclarationConfig[]
|
||||
|
||||
then we can start the container by importing the configuration class in the test class:
|
||||
|
||||
include-code::beandeclaration/SpringTest[]
|
||||
|
||||
|
||||
[[testing.testcontainers.via-declaration-classes]]
|
||||
== Using via importing container declaration classes
|
||||
|
||||
A common pattern with Testcontainers is to declare the Container instances as static fields in an interface.
|
||||
For example the following interface `MyInterface` declares two containers, one named `mongo` of type MongoDB and another named `neo` of type Neo4j:
|
||||
|
||||
include-code::importcontainers/MyInterface[]
|
||||
|
||||
When you have containers declared in this way, then you can have these containers managed by Spring Boot as beans.
|
||||
All that is needed to do that is adding javadoc:org.springframework.boot.testcontainers.context.ImportTestcontainers[format=annotation] to your configuration class as in:
|
||||
|
||||
include-code::importcontainers/MyConfiguration[]
|
||||
|
||||
TIP: Using interfaces for declaring contains helps with reuse.
|
||||
When containers are declared in an interface, this can be reused in your javadoc:org.springframework.context.annotation.Configuration[format=annotation] classes and in test classes.
|
||||
|
||||
|
||||
[[test.testcontainers.container-lifecycle]]
|
||||
== Lifecycle of managed containers
|
||||
|
||||
If you have used the annotations and extensions provided by Testcontainers, then the lifecycle of container instances is managed by the Testcontainers.
|
||||
Please refer to the {url-testcontainres-java-doc}[Testcontainers official documentation] for the information about lifecycle of the containers, when managed by the Testcontainers.
|
||||
|
||||
When the containers are managed by Spring as beans, then the lifecycle is clearly defined by Spring.
|
||||
The container beans are created and started before the beans of other types are created.
|
||||
This process ensures that any beans, which rely on functionality provided by the containers, can use those functionalities.
|
||||
|
||||
The test containers can be started multiple times.
|
||||
Like any other beans the test containers are created and started once per application context managed by the TestContext Framework.
|
||||
For details about how TestContext framework manages the underlying application contexts and beans therein, please refer to the {url-spring-framework-docs}[official Spring documentation].
|
||||
|
||||
The container beans are stopped after the destruction of beans of other types.
|
||||
This ensures that any beans depending on the functionalities provided by the containers are cleaned up first.
|
||||
|
||||
TIP: When your application beans rely on functionality of containers, prefer configuring the containers as Spring beans.
|
||||
When containers are managed as Spring beans, then Spring framework ensures that upon start the container beans are started before any beans relying on them.
|
||||
On shutdown the application beans depending on container functionalities are cleaned up first, and only then are the containers shut down.
|
||||
|
||||
NOTE: Having containers managed by Testcontainers instead of as Spring beans provides no guarantee of order in which beans and containers will shutdown.
|
||||
It can happen that containers are shutdown before the beans relying on container functionality are cleaned up.
|
||||
This can lead to exceptions being thrown by client beans due to loss of connection for example.
|
||||
|
||||
The containers are stopped as part of the application shutdown process, managed by the TestContext framework.
|
||||
When the application context gets shutdown, the containers are shutdown as well.
|
||||
This usually happens after all tests using that specific cached application context have finished executing, but may happen earlier depending on the caching behavior configured in TestContext Framework.
|
||||
|
||||
It is important to note that a single test container instance can be, and often is, retained across execution of tests from multiple test classes.
|
||||
|
||||
|
||||
|
||||
[[testing.testcontainers.service-connections]]
|
||||
|
||||
Reference in New Issue
Block a user