하나하나 특정 코드에 대한 역할과 설명만 작성해서 공부용도로 사용.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount")int amount) {
return new HelloResponseDto(name, amount);
}
}
1. @RestController
컨트롤러를 JSON을 반환하는 컨트롤러로 변경해주는 역할을 한다.
기존의 @Controller + @ResponseBody를 합친 기능이라고 알아둔다.
2. @GetMapping
HTTP Method인 Get의 요청을 받을 수 있는 API
기존의 @RequestMapping(method = RequestMethod.GET) 과 같다.
3. @RequestParam
외부에서 API로 넘긴 파라미터를 가져오는 어노테이션
외부에서 name이란 이름으로 넘긴 파라미를 메서드 파라미터 name에 저장하게된다.
* API 작성시에는 최근 Rest 한 API를 작업하는 추세이므로 RestController를 주로 사용한다.
* 외부에서 해당 API를 호출 했을 경우 전송되는 파라미터의 이름으로 담긴 정보를 얻어와 컨트롤 할 수 있다.
@RunWith(SpringRunner.class)
@WebMvcTest
public class HelloControllerTests {
@Autowired
private MockMvc mvc;
@Test
public void hello가_리턴된다() throws Exception {
String hello = "hello";
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
}
@Test
public void helloDto_리턴() throws Exception {
String name = "hello";
int amount = 1000;
mvc.perform(get("/hello/dto")
.param("name", name)
.param("amount", String.valueOf(amount)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name", is(name)))
.andExpect(jsonPath("$.amount", is(amount)));
}
}
4. RunWith(SpringRunner.class)
테스트 진행시 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다.
여기서 SpringRunner라는 스프링 실행자를 사용한다.
즉, 스프링부트 테스트와 JUnit사이 연결자역할을 한다
5. WebMvcTest
여러 스프링 테스트 어노테이션 중 Web(Mvc)에 집중할 수 있는 어노테이션
선언시 @Controller, ControllerAdvice등을 사용 할 수 있다.
단 @Service, Component, Repository는 사용할 수 없다
여기서는 컨트롤러만 사용하기 떄문에 선언한다
6. private MockMvc mvc
웹 API를 테스트할 때 사용한다.
스프링 MVC 테스트의 시작점.
이 클래스를 통해 HTTP GET, POST등에 대한 API 테스트를 할 수 있다
7. mvc.perform(get("/hello"))
MockMvc를 통해 /hello 주소로 HTTP GET 요청을 합니다
8. andExpect(status().isOk())
mvc.perform의 결과를 검증한다.
HTTP header 의 Status를 검증합니다.
여기서는 200인지 체크한다
9. andExpect(content().string(hello))
mvc.perform의 결과를 검증합니다.
응답 본문의 내용을 검증한다.
Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는 지 검증한다.
10. param
API 테스트시 사용될 요청 파라미터를 설정한다.
단 값은 String 만 허용된다.
날짜, 숫자 데이터들도 문자열로 변경해야 한다.
11. jsonPath
JSON 응답값을 필드별로 검증할 수 있는 메소드.
$을 기준으로 필드명을 명시한다.
여기서 name과 amount를 검증하니 $.name , $.amount 로 검증합니다.
public class HelloResponseDtoTest {
@Test
public void test1() {
//given
String name = "test";
int amount = 1000;
// when
HelloResponseDto dto = new HelloResponseDto(name, amount);
assertThat(dto.getName()).isEqualsTo(name);
assertThat(dto.getAmount()).isEqualsTo(amount);
}
}
12. assertThat
assertj라는 테스트검증 라이브러리의 메소드
검증하고 싶은 대상을 메서드 인자로 받는다.
메서드 체이닝이 지원되어 isEqualsTo 와같이 메서드를 이어 사용가능하다.
13. isEqualsTo
assertj의 동등비교 메서드
assertThat에 있는 값과 isEqualsTo의 값을 비교해서 같을때만 성공한다.
assertj의 경우 Junit에서 자동으로 라이브러리 등록을 해준다.
- JUnit vs assertj의 장점
1. CoreMatchers와 달리 추가적으로 라이브러리가 필요하지 않다.
Junit의 assertThat을 사용하면 is().와 같이 CoreMatchers 라이브러리가 필요하다.
2. 자동완성이 좀더 확실하게 지원된다.
IDE에서는 CoreMatchers와 같은 Matcher 라이브러리 자동완성이 지원이 약하다.
- 테스트가 실패하면 그레들 버전이 5버전인지 체크할 것.
출처 - 스프링부트와 AWS로 혼자 구현하는 웹 서비스
'Back-End' 카테고리의 다른 글
MySQL) Partitioning ( Range , List ) (0) | 2021.09.19 |
---|---|
디자인 패턴의 정의 및 종류 (0) | 2021.05.29 |
Git ) rebase -i (0) | 2021.03.20 |