Tranches d’essai Spring Boot : @WebMvcTest et @DataJpaTest
Utilisez @WebMvcTest pour essayer les contrôleurs isolément et @DataJpaTest pour essayer la couche des référentiels.
Tranches d’essai Spring Boot : @WebMvcTest et @DataJpaTest est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Que sont les tranches de test ?
Les tranches de test ne chargent que la partie pertinente du contexte Spring pour une couche donnée. Elles sont plus rapides que @SpringBootTest, qui charge tout, et isolent la couche testée.
@WebMvcTest : couche contrôleur uniquement
@WebMvcTest(UserController.class) charge uniquement la couche web : contrôleurs, filtres, configuration de sécurité et Jackson. Les services et les référentiels doivent être simulés avec @MockBean.
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired MockMvc mockMvc;
@MockBean UserService userService;
@Test
void get_user_returns_200() throws Exception {
given(userService.findById(1L)).willReturn(new UserDto(1L, "Alice"));
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("Alice"));
}
}Construction de requêtes MockMvc
Construisez les requêtes avec MockMvcRequestBuilders. Définissez les en-têtes, le type de contenu et le corps de la requête pour les tests POST/PUT.
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content("""{"name":"Bob","email":"bob@example.com"}"""))
.andExpect(status().isCreated())
.andExpect(header().exists("Location"));Tester la validation avec @WebMvcTest
Les corps de requête non valides déclenchent MethodArgumentNotValidException. Vérifiez le statut 400 et le corps de la réponse d'erreur.
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content("""{"name":"","email":"bad"}"""))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.errors.name").exists());@DataJpaTest : couche référentiel uniquement
@DataJpaTest charge les référentiels JPA, la base de données H2 intégrée, Hibernate et un TestEntityManager. Les autres composants, notamment les services et la couche web, ne sont pas chargés.
@DataJpaTest
class UserRepositoryTest {
@Autowired UserRepository repo;
@Autowired TestEntityManager em;
@Test
void find_by_email() {
em.persist(new User("Alice", "alice@example.com"));
em.flush();
Optional<User> found = repo.findByEmail("alice@example.com");
assertTrue(found.isPresent());
}
}TestEntityManager
TestEntityManager encapsule EntityManager avec des méthodes pratiques : persist(), flush(), find(), persistAndFlush().
User saved = em.persistAndFlush(new User("Bob", "bob@example.com"));
assertNotNull(saved.getId());
em.clear(); // detach all to force a real DB read
User fromDb = repo.findById(saved.getId()).orElseThrow();
assertEquals("Bob", fromDb.getName());Annulation des transactions de @DataJpaTest
Chaque test s'exécute dans une transaction qui est annulée après le test par défaut. Les données ne sont pas conservées entre les tests, ce qui garantit leur isolation sans nettoyage manuel.
@DataJpaTest // each @Test is rolled back automatically
class OrderRepositoryTest {
@Test @Transactional
void count_orders_is_zero_by_default() {
assertEquals(0, orderRepo.count());
}
}Remplacer H2 par une vraie base de données dans @DataJpaTest
Utilisez @AutoConfigureTestDatabase(replace = Replace.NONE) pour exécuter @DataJpaTest avec la vraie base de données configurée dans application.properties, plutôt qu'avec H2.
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ProductRepositoryTest {
// Uses the configured PostgreSQL, not H2
}@JsonTest : sérialisation JSON uniquement
@JsonTest charge la configuration Jackson. Utilisez JacksonTester pour vérifier que les objets sont sérialisés et désérialisés comme prévu.
@JsonTest
class UserDtoJsonTest {
@Autowired JacksonTester<UserDto> json;
@Test
void serializes_correctly() throws Exception {
UserDto dto = new UserDto(1L, "Alice", "alice@example.com");
assertThat(json.write(dto)).hasJsonPathStringValue("$.email");
}
}@RestClientTest : couche client REST
@RestClientTest teste les clients HTTP fondés sur RestTemplate ou WebClient. Il configure un MockRestServiceServer pour simuler les réponses HTTP.
@RestClientTest(WeatherClient.class)
class WeatherClientTest {
@Autowired WeatherClient client;
@Autowired MockRestServiceServer server;
@Test
void fetches_weather() {
server.expect(requestTo("/api/weather")).andRespond(withSuccess("""{"temp":22}""", APPLICATION_JSON));
Weather w = client.getWeather("Istanbul");
assertEquals(22, w.getTemp());
}
}Combiner les tranches avec @Import
Les tranches excluent de nombreux composants par conception. Utilisez @Import(SomeConfig.class) pour ajouter les classes de configuration précises dont la tranche a besoin.
@WebMvcTest(UserController.class)
@Import(SecurityConfig.class) // load security for auth tests
class SecuredControllerTest { ... }Vérification rapide
Quelle base de données @DataJpaTest utilise-t-il par défaut ?
Récapitulatif
@WebMvcTest teste la couche contrôleur avec MockMvc ; simulez les services avec @MockBean. @DataJpaTest teste les référentiels avec TestEntityManager et annule automatiquement les transactions. Utilisez Replace.NONE pour une vraie base de données. Utilisez @JsonTest pour la sérialisation et @RestClientTest pour les clients HTTP.
Questions Fréquemment Posées
La leçon « Tranches d’essai Spring Boot : @WebMvcTest et @DataJpaTest » est-elle gratuite ?
Oui — le texte complet de « Tranches d’essai Spring Boot : @WebMvcTest et @DataJpaTest » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Tranches d’essai Spring Boot : @WebMvcTest et @DataJpaTest » ?
Utilisez @WebMvcTest pour essayer les contrôleurs isolément et @DataJpaTest pour essayer la couche des référentiels. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Tranches d’essai Spring Boot : @WebMvcTest et @DataJpaTest » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Essais paramétrés avec @CsvSource et @MethodSource
- Mockito avancé : captureurs d’arguments et espions
- Tranches d’essai Spring Boot : @WebMvcTest et @DataJpaTest
- Testcontainers : essais d’intégration avec une vraie base de données