티스토리 뷰
1. @webMvcTest 를 사용한 스프링 부트 테스트
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void hello() throws Exception {
String hello = "hello";
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
}
}
- @RunWith(SpringRunner.class)는 스프링부트 테스트와 Junit 사이에 연결자 역할을 한다 - junit4 필수
- @Autowired를 통하여 스프링이 관리하는 Bean을 주입받는다
- MockMvc는 스프링에서 제공하는 애플리케이션을 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스이다
- @WebMvcTest 어노테이션을 사용하여 외부연동과 관련된 부분 (web)에 대한 테스트에 집중 할 수 있는 어노테이션이다. 그러므로 @Serivce @Repository 에 대한 테스트는 불가하다
2. @SpringBootTest & webApplicationContext를 사용한 스프링 부트 테스트
앞서 말했듯 @WebMvcTest는 단순히 Web layer에 대한 테스트를 수행하기 때문에 service 그리고 repository에 대한 테스트를 실행할 수 없다. 하지만 SpringBootTest와 WebApplicationContext를 사용한다면 테스트 수행이 가능하다
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class CommonTest {
@LocalServerPort
protected int port;
@Autowired
protected WebApplicationContext webApplicationContext;
protected MockMvc mockMvc;
protected final String URL = "http://localhost:";
@Before
public void setup() {
mockMvc = MockMvcBuilders
.webAppContextSetup(webApplicationContext)
.build();
}
@Test
public void testGetPostsAndCheckSuccessWhenGuest() throws Exception {
//when
MvcResult mvcResult = mockMvc.perform(
get(POST_URL)
.contentType(MediaType.APPLICATION_JSON)
).andReturn();
//then
assertEquals(200, mvcResult.getResponse().getStatus());
}
}
}
- @SpringBootTest는 스프링부트 어플리케이션 테스트에 필요한 거의 모든 의존성을 제공해 준다.
- @SpringBootApplication을 기준으로 스프링 빈을 등록함과 동시에 빌드 툴에 의해 추가된 스프링부트 의존성 제공
- @SpringBootTest 어노테이션에는 webEnvironment라는 값을 통해 웹 어플리케이션 테스트시 Mock으로 테스트할 것인지 실제 톰캣 같은 서블릿 컨테이너를 구동해서 테스트할 것인지를 정할 수 있다
- 위의 코드는 랜덤 포트를 줌으로써 서블릿 컨테이너를 구동해서 테스트 하였다
- WebApplicationContext는 Spring의 ApplicationContext를 확장한 인터페이스로, 웹 애플리케이션에서 필요한 몇 가지 기능을 추가한 인터페이스다 객체를 생성하여 mockMvc에 설정해줌으로써 실제 서블릿 컨테이너로 테스트를 할 수 있다
- @Before은 테스트가 실행되기 전에 실행되어야 하는 메소드에 선언하여 사용한다. 위의 코드 같은 경우는 MockMvc를 생성하는 메소드에 선언함으로써 테스트가 실행되기전 MockMvc 객체를 생성하여 준다
3. given-when-then 방식으로 테스트 코드 작성하기
@Test
public void testGetCommentsSuccess() throws Exception {
//given
String writerAccessToken = createUser().getAccessToken().getToken();
Long postId = createPost(writerAccessToken).getDetailedPost().getId();
//when
MvcResult mvcResult = mockMvc.perform(
get(POST_URL + "/" + postId + "/comments")
).andReturn();
//then
assertEquals(200, mvcResult.getResponse().getStatus());
}
- given은 실제 테스트 해보려는 기능에 대하여 사전으로 필요한 데이터들을 생성해내는 작업
- 위의 코드는 게시글에 대한 댓글을 작성하는 기능을 테스트하기 위한 코드인데 http의 get 메소드의 파라미터로 필요한 댓글이 달릴 게시글의 id 와 accessToken을 생성해주는 작업을 하였다
- when은 실제 테스트 해보려는 기능을 작성
- HTTP 통신에 대한 테스트를 실행하는 부분이다 메소드의 종류 (위 코드에서는 get)와 url 경로 설정하고 결과값을 리턴하는 andReturn()을 하였다. - mockMv.perform에 대한 다양한 기능이 많으므로 용도에 맞게 사용하도록 한다
- then은 실행한 테스트가 예상된 결과값을 내는지에 대한 점검
- assertEquals는 junit에서 제공하는 검증 메소드이다 assertEquals(예상결과, 실제 테스트 결과)의 형식으로 입력하여 테스트에 대한 결과를 검증하는 부분이다 위의 코드에서는 테스트 코드의 상태코드를 비교하여 검증하였다
'BackEnd > SpringBoot' 카테고리의 다른 글
[spring] - Spring Data JPA를 사용한 페이징 처리 (0) | 2020.08.09 |
---|---|
[Debug] - (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 에러 해결 (0) | 2020.08.08 |
[spring] - @RequestParam과 @PathVariable의 차이 (0) | 2020.07.28 |
[Spring]-REST 어플리케이션 예외처리 (0) | 2020.07.22 |
[spring]-Gradle을 이용한 멀티 모듈 프로젝트 생성하기 (0) | 2020.07.16 |