//Kontroler: HelloController.java

package pl.com.pl.springboottest_mocks;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, MockMvc!";
    }
}



 //Test warstwy web z MockMvc: HelloControllerMockMvcTest.java

package pl.com.pl.springboottest_mocks;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@WebMvcTest(HelloController.class)                // testujemy tylko HelloController
public class HelloControllerMockMvcTest {

    @Autowired
    private MockMvc mockMvc;                       // wstrzykujemy MockMvc

    @Test
    @DisplayName("GET /hello should return 'Hello, MockMvc!'")
    void shouldReturnHelloMockMvc() throws Exception {
        mockMvc.perform(get("/hello"))             // wykonujemy GET /hello
               .andExpect(status().isOk())        // oczekujemy 200 OK
               .andExpect(content().string("Hello, MockMvc!"));  // i poprawnej treści
    }
}


Co i jak?

@WebMvcTest(HelloController.class)
Uruchamia kontekst Spring, ale ładuje tylko to, co potrzebne do testów webowych (kontrolery, filtry, Jackson itp.), bez całej aplikacji.

@Autowired MockMvc mockMvc
Dostajemy obiekt, którym możemy symulować żądania HTTP „w pamięci”.

mockMvc.perform(...)
Budujemy i wykonujemy żądanie.

andExpect(...)
Sprawdzamy odpowiedni status i zawartość odpowiedzi.



