@MockMVC를 활용해서 Controller 테스트를 해보자

Alex·2025년 2월 12일
0

Plaything

목록 보기
104/118

보통 테스트는 서비스단을 주로한다.

컨트롤러단 테스트는 잘 안하게 된다(필요성을 딱히 못 느꼈다)

admin api나 jwt 인증이 필요한 경우도 이 기능이 제대로 작동하는지는
직접 api 요청을 쏴보면 명확하게 나타난다.
그럼에도, 시큐리티 설정을 실수로 변경할 수도 있다는 생각에 불안함이 든다.

그래서, 테스트 코드를 짜서 리팩토링할 때 실수로 기능의 주요 로직을 건들이면 바로 알 수 있도록 했다.

@MockMvc란?

이러한 컨트롤러단 테스트를 할 때 활용하는 게 @MockMvc다.

It performs full Spring MVC request handling but via mock request and response objects instead of a running server.

The Spring MVC Test framework, also known as MockMvc, aims to provide more complete testing for Spring MVC controllers without a running server. It does that by invoking the DispatcherServlet and passing “mock” implementations of the Servlet API from the spring-test module which replicates the full Spring MVC request handling without a running server.

직접 서버를 띄우지 않고, 스프링 mvc의 request 핸들링을 복제한 mock을 활용한다.

환경설정을 할 땐

class MyWebTests {

	MockMvc mockMvc;

	@BeforeEach
	void setup() {
		this.mockMvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();
	}

	// ...

}

이렇게 컨트롤러 하나에 맞춰서 할 수도 있다.

@SpringJUnitWebConfig(locations = "my-servlet-context.xml")
class MyWebTests {

	MockMvc mockMvc;

	@BeforeEach
	void setup(WebApplicationContext wac) {
		this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
	}

	// ...

}

이렇게 스프링 설정을 활용할 수도 있다.

However, using the standaloneSetup does imply the need for additional webAppContextSetup tests in order to verify your Spring MVC configuration.

webAppContextSetup는 실제 스프링 mvc 설정을 로딩해서 활용한다. 설정 내용을 캐싱하기 때문에, 테스트를 빠르게 돌릴 수 있다.standaloneSetup은 스프링 mvc 설정을 실제로 읽어오지 않기 때문에, 설정내용을 테스트하고 싶다면 webAppContextSetup를 써야 한다고 한다

이런식으로 요청과 응답에 대한 mock test를 작성할 수 있다.

request나 reponse를 작성하는 방법은 공식문서에 잘 설명돼 있으니 참고하면 된다.

참고로 스프링 시큐리티 설정을 읽어오려면 아래처럼 해야 한다.

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = SecurityConfig.class)
@WebAppConfiguration
public class CsrfShowcaseTests {

	@Autowired
	private WebApplicationContext context;

	private MockMvc mvc;

	@BeforeEach
	public void setup() {
		mvc = MockMvcBuilders
				.webAppContextSetup(context)
				.apply(springSecurity()) 
				.build();
	}
	// ...
}

그래서 webAppContextSetup는 언제 쓰는데?

webAppContextSetup를 쓰는 이유는

* bean들이 autowired돼야 하고, 인터셉터가 작동하며, 다른 components들이 함께 작동해야 할때
* api documentation을 좀더 명확하게 할 때

인 것으로 보인다.

@SpringBootTest와 @WebMvcTest의 차이는 뭐야?

@WebMvcTest는 web layer의 bean들만 로딩해주기 때문에 service layer에 있는 bean들을 직접 내가 mock으로 만들거나, 설정 파일을 읽어와야 한다. 빠르긴 하지만, 불편할 수 있다.

@SpringBootTest를 사용하면, 스프링 부트로 하여금 main configuration class (one with @SpringBootApplication for instance)를 읽어오게 하고서 설정파일을 로딩하게 만들 수 있다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글