Tests Unitaires, Intégration & TestContainers
JUnit 5, MockMvc, @DataJpaTest, stratégie de tests, bases Docker isolées, pipelines CI/CD fiables : maîtrisez le testing Spring Boot au niveau pro.
Introduction
Une application professionnelle doit être testée en profondeur. Spring Boot fournit un écosystème complet pour tester les couches web, services, persistence, sécurité et intégration.
Avec TestContainers, vos tests s’exécutent contre de vraies bases Docker : PostgreSQL, Kafka, Redis, MongoDB… C’est la norme moderne dans les équipes matures et les pipelines CI/CD fiables.
Lexique essentiel
Moteur de test moderne utilisé avec Spring Boot.
Test d’API REST sans serveur externe.
Démarre tout le contexte Spring pour les tests d’intégration.
Test spécialisé pour la couche JPA/Hibernate.
Isolation complète via des bases Docker démarrées automatiquement.
H2 pour les tests rapides (mais limité pour les projets entreprise).
1. Tests Unitaires : Services & logique métier
Les tests unitaires doivent être purs, rapides, et ne pas dépendre de Spring.
Exemple
class PriceCalculatorTest {
@Test
void shouldCalculateTotalPrice() {
var calc = new PriceCalculator();
assertEquals(200, calc.total(100, 2));
}
}
👉 Aucun Spring, aucune base → tests ultra rapides.
2. Tests API REST avec MockMvc
@WebMvcTest(OrderController.class)
class OrderControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private OrderService service;
@Test
void shouldCreateOrder() throws Exception {
mvc.perform(post("/orders")
.content("""
{"productId":"P1","quantity":2,"customerId":"C1"}
""")
.contentType("application/json"))
.andExpect(status().isOk());
}
}
👉 Parfait pour tester les DTO, validations, endpoints, statuts HTTP.
3. Tests JPA & Hibernate avec @DataJpaTest
Ce test charge uniquement la couche JPA → rapide et précis.
@DataJpaTest
class OrderRepositoryTest {
@Autowired
private OrderRepository repo;
@Test
void shouldStoreOrder() {
var order = new Order("C1", BigDecimal.valueOf(120));
var saved = repo.save(order);
assertNotNull(saved.getId());
}
}
- Tester les repositories avec @DataJpaTest.
- Tester les controllers avec @WebMvcTest.
- Tester les services avec JUnit pur + mocks.
- Tester les intégrations via TestContainers.
- Ne jamais mélanger toutes les couches dans un seul test.
4. Tests d’intégration entreprises avec TestContainers
TestContainers démarre de vrais services Docker pendant les tests : PostgreSQL, Kafka, Redis, RabbitMQ…
Exemple PostgreSQL
@Testcontainers
@SpringBootTest
class OrderIntegrationTest {
@Container
static PostgreSQLContainer> db =
new PostgreSQLContainer<>("postgres:16")
.withDatabaseName("testdb")
.withUsername("user")
.withPassword("pwd");
@Autowired
private OrderRepository repo;
@Test
void shouldPersistOrder() {
var order = new Order("C1", BigDecimal.TEN);
var saved = repo.save(order);
assertNotNull(saved.getId());
}
}
👉 Résultat : environnement identique à la production.
Exemple : TestContainers Kafka
@Container
static KafkaContainer kafka = new KafkaContainer("confluentinc/cp-kafka:7.5.0");
Permet de tester un producteur/consommateur Kafka avec un cluster réel.
5. Intégration CI/CD
- GitHub Actions supporte TestContainers nativement.
- GitLab CI : activer le service Docker In Docker.
- TestContainers = robustesse + zéro mock inutile.
Quiz : Tests & TestContainers
-
Q1. Quel test charge tout le contexte Spring ?
- A. @WebMvcTest
- B. @SpringBootTest ✔
- C. @DataJpaTest
-
Q2. Quel outil permet de tester avec de vraies bases ?
- A. H2
- B. Mockito
- C. TestContainers ✔
Exercice d’application
Implémentez un pipeline de tests complet :
— Tests unitaires sur les services
— Tests API MockMvc
— Tests JPA avec @DataJpaTest
— Intégration PostgreSQL via TestContainers
— Script CI pour exécution automatisée
Résumé
Une architecture de tests professionnelle combine rapidité, isolation, réalisme et stabilité. Grâce à JUnit 5, MockMvc, @DataJpaTest et TestContainers, vous construisez des pipelines fiables, propres et adaptés aux environnements d’entreprise.
Navigation de la Formation
Tests unitaires et intégration. Contenu à remplacer.
