programing

SpringBoot에서 MockMvc를 사용하는 경우의 차이점WebMvcTest 테스트 및 사용

oldcodes 2023. 3. 20. 23:34
반응형

SpringBoot에서 MockMvc를 사용하는 경우의 차이점WebMvcTest 테스트 및 사용

저는 Spring Boot에 익숙하지 않기 때문에 Spring Boot에서의 테스트 방법을 이해하려고 합니다.다음 두 코드 스니펫의 차이점이 무엇인지 좀 헷갈립니다.

코드 조각 1:

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerApplicationTest {
    @Autowired    
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
    }
}

이 테스트에서는@WebMvcTest주석은 기능 슬라이스 테스트용이며 웹 애플리케이션의 MVC 레이어만 테스트합니다.

코드 스니펫 2:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
    mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
    }
}

이 테스트에서는@SpringBootTest주석과MockMvc코드 스니펫1과 어떻게 다른가요?이 방법이 다른 점은 무엇입니까?

편집: 코드 스니펫 3 추가 (Spring 문서의 통합 테스트 예시로 확인)

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
public class HelloControllerIT {
    
    @LocalServerPort private int port;
    private URL base;
    
    @Autowired private TestRestTemplate template;
    
    @Before public void setUp() throws Exception {
        this.base = new URL("http://localhost:" + port + "/");
    }
    
    @Test public void getHello() throws Exception {
        ResponseEntity < String > response = template.getForEntity(base.toString(), String.class);
        assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
    }
}

@SpringBootTest는 일반적인 테스트 주석입니다.1.4 이전 버전에서도 동일한 기능을 사용할 수 있는 제품을 찾고 있다면 이 제품을 사용해야 합니다.슬라이싱을 전혀 사용하지 않습니다. 즉, 전체 애플리케이션 컨텍스트가 시작되고 컴포넌트 스캔이 전혀 커스터마이즈되지 않습니다.

@WebMvcTest정의한 컨트롤러와 MVC 인프라스트럭처만 스캔합니다.바로 그겁니다.따라서 컨트롤러가 서비스 계층의 다른 콩에 어느 정도 종속되어 있는 경우 사용자가 직접 구성을 로드하거나 모의 구성을 제공할 때까지 테스트가 시작되지 않습니다.앱의 로딩은 극히 일부이기 때문에 훨씬 빠릅니다.이 주석에서는 슬라이싱을 사용합니다.

이 문서를 읽는 것도 도움이 될 것입니다.

@Spring Boot테스트 주석에서는 Spring Boot에 메인컨피규레이션클래스(@Spring Boot Application 등)를 검색하여 이를 사용하여 Spring 애플리케이션콘텍스트를 기동하도록 지시합니다.스프링 부트테스트 로딩은 응용 프로그램을 완료하고 속도가 느려질 수 있는 모든 콩을 주입합니다.

@WebMvcTest - 컨트롤러 계층을 테스트하기 위해 필요한 나머지 종속성을 모의 개체를 사용하여 제공해야 합니다.

아래에 참조할 수 있도록 주석을 몇 개 더 추가해 주십시오.

애플리케이션의 슬라이스 테스트애플리케이션 전체를 자동적으로 설정하는 대신에, 애플리케이션의 단순한 「슬라이스」를 테스트하고 싶은 경우가 있습니다.Spring Boot 1.4에서는 4개의 새로운 테스트 주석이 도입되었습니다.

@WebMvcTest - for testing the controller layer
@JsonTest - for testing the JSON marshalling and unmarshalling
@DataJpaTest - for testing the repository layer
@RestClientTests - for testing REST clients

상세한 것에 대하여는, https://spring.io/guides/gs/testing-web/ 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/39865596/difference-between-using-mockmvc-with-springboottest-and-using-webmvctest

반응형