0Pricing
Java Academy · Lezione

Slice di test Spring Boot: @WebMvcTest e @DataJpaTest

Utilizzi @WebMvcTest per testare i controller in isolamento e @DataJpaTest per testare il livello dei repository.

Slice di test Spring Boot: @WebMvcTest e @DataJpaTest è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Cosa sono gli slice di test?

Gli slice di test caricano solo la parte pertinente del contesto Spring per un livello specifico. Sono più veloci di @SpringBootTest (che carica tutto) e isolano il livello sottoposto a test.

@WebMvcTest: solo il livello controller

@WebMvcTest(UserController.class) carica solo il livello web: controller, filtri, configurazione di sicurezza e Jackson. I servizi e i repository devono essere simulati con @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"));
    }
}

Creazione delle richieste MockMvc

Costruisca le richieste con MockMvcRequestBuilders. Imposti intestazioni, tipo di contenuto e corpo della richiesta per i test 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"));

Test della validazione in @WebMvcTest

I corpi delle richieste non validi generano MethodArgumentNotValidException. Verifichi lo stato 400 e il corpo della risposta di errore.

mockMvc.perform(post("/api/users")
        .contentType(MediaType.APPLICATION_JSON)
        .content("""{"name":"","email":"bad"}"""))
    .andExpect(status().isBadRequest())
    .andExpect(jsonPath("$.errors.name").exists());

@DataJpaTest: solo il livello repository

@DataJpaTest carica i repository JPA, il database H2 integrato, Hibernate e un TestEntityManager. Gli altri bean, come servizi e componenti web, non vengono caricati.

@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 avvolge EntityManager con metodi pratici: 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());

Rollback di @DataJpaTest

Ogni test viene eseguito in una transazione che, per impostazione predefinita, viene annullata al termine del test. I dati non persistono tra i test, garantendo l'isolamento senza dover eseguire una pulizia manuale.

@DataJpaTest  // each @Test is rolled back automatically
class OrderRepositoryTest {
    @Test @Transactional
    void count_orders_is_zero_by_default() {
        assertEquals(0, orderRepo.count());
    }
}

Sostituzione di H2 con un database reale in @DataJpaTest

Utilizzi @AutoConfigureTestDatabase(replace = Replace.NONE) per eseguire @DataJpaTest sul database reale configurato in application.properties invece che su H2.

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ProductRepositoryTest {
    // Uses the configured PostgreSQL, not H2
}

@JsonTest: solo serializzazione JSON

@JsonTest carica la configurazione di Jackson. Utilizzi JacksonTester per verificare che gli oggetti vengano serializzati e deserializzati come previsto.

@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: livello client REST

@RestClientTest verifica i client HTTP basati su RestTemplate o WebClient. Configura un MockRestServiceServer per simulare le risposte 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());
    }
}

Combinazione delle slice con @Import

Per progettazione, le slice escludono molti bean. Utilizzi @Import(SomeConfig.class) per aggiungere specifiche classi di configurazione necessarie alla slice.

@WebMvcTest(UserController.class)
@Import(SecurityConfig.class)  // load security for auth tests
class SecuredControllerTest { ... }

Verifica rapida

Quale database utilizza @DataJpaTest per impostazione predefinita?

Riepilogo

@WebMvcTest verifica il livello controller con MockMvc; simuli i servizi con @MockBean. @DataJpaTest verifica i repository con TestEntityManager e rollback automatico. Utilizzi Replace.NONE per un database reale. Utilizzi @JsonTest per la serializzazione e @RestClientTest per i client HTTP.

Domande Frequenti

La lezione «Slice di test Spring Boot: @WebMvcTest e @DataJpaTest» è gratuita?

Sì — il testo completo di «Slice di test Spring Boot: @WebMvcTest e @DataJpaTest» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «Slice di test Spring Boot: @WebMvcTest e @DataJpaTest»?

Utilizzi @WebMvcTest per testare i controller in isolamento e @DataJpaTest per testare il livello dei repository. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Slice di test Spring Boot: @WebMvcTest e @DataJpaTest»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Test parametrizzati con @CsvSource e @MethodSource
  2. Mockito avanzato: ArgumentCaptor e spy
  3. Slice di test Spring Boot: @WebMvcTest e @DataJpaTest
  4. Testcontainers: test di integrazione con database reali
← Torna a Java Academy