728x90
SMALL
큰 규모의 프로젝트라도 롬복으로 전환 가능
-> 테스트 코드가 기존의 코드를 지켜주기 때문
web 패키지에 dto 패키지 추가 후 HelloReponseDto 생성
package com.jojoldu.book.springboot.web;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter // 선언된 모든 필드의 get 메소드를 생성해준다.
@RequiredArgsConstructor // 선언된 모든 final 필드가 포함된 생성자를 생성해준다. final이 없는 필드는 생성자에 포함되지 않는다.
public class HelloResponseDto {
private final String name;
private final int amount;
}
롬복이 잘 작동하는지 테스트 코드 작성
package com.jojoldu.book.springboot.web;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat; // Junit의 기본 assertThat이 아닌 assertj의 assertThat을 사용. assertj 역시 Junit에서 자동으로 라이브러리 등록을 해줌.
public class HelloResponseDtoTest {
@Test
public void 롬복_기능_테스트(){
//given
String name = "test";
int amount = 1000;
//when
HelloResponseDto dto = new HelloResponseDto(name, amount);
//then
assertThat(dto.getName()).isEqualTo(name); // assertj라는 테스트 검증 라이브러리의 검증 메소드. 검증하고 싶은 대상을 메소드 인자로 받는다. 메소드 체이닝 지원
assertThat(dto.getAmount()).isEqualTo(amount); // isEqualTo : assertj의 동등 비교 메소드. assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을 때만 성공
}
}
HelloController에도 새로 만든 ResponseDto 사용하도록 코드 추가
package com.jojoldu.book.springboot.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController // JSON을 반환하는 컨트롤러로 만들어줌. @ResponseBody를 각 메소드마다 선언했던 것을 한번에 사용할 수 있게 해준다
public class HelloController {
@GetMapping("/hello") // Http Method인 Get의 요청을 받을 수 있는 API를 만들어줌. 이 프로젝트는 /hello 로 요청이 오면 문자열 hello를 반환하는 기능을 가지게 되었다
public String hello(){
return "hello";
}
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name, // @RequestParam : 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션
@RequestParam("amount") int amount){
return new HelloResponseDto(name, amount);
}
}
추가된 API를 테스트하는 코드를 HelloControllerTest에 추가
package com.jojoldu.book.springboot;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@RunWith(SpringRunner.class) //테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다. 여기서는 SpringRunner라는 스프링 실행자를 사용. 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할.
@WebMvcTest // Web(Spring MVC)에 지중할 수 있는 어노테이션. 선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있다. (단, @Service, @Component, @Repository 등은 사용할 수 없다)
public class HelloControllerTest {
@Autowired // 스프링이 관리하는 Bean을 주입받는다
private MockMvc mvc; // 웹 API를 테스트할 때 사용한다. 스프링 MVC 테스트의 시작점. 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있다.
@Test
public void hello가_리턴된다() throws Exception{
String hello = "hello";
// MockMvc를 통해 /hello 주소로 HTTP GET 요청을 한다. 체이닝 지원->아래와 같이 여러 검증 기능을 이어서 선언 가능
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
// mvc.perform의 결과를 검증. HTTP Header의 Status를 검증. 200,404,500 등의 상태 검증.(여기선 OK 즉, 200인지 아닌지 검증)
// mvc.perform의 결과를 검증. 응답 본문의 내용을 검증. Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는지 검증
}
@Test
public void helloDto가_리턴된다() throws Exception{
String name = "hello";
int amount = 1000;
mvc.perform(
get("/hello/dto")
.param("name",name) // API 테스트할 때 사용될 요청 파라미터를 설정. 단, 값은 String일 때만 허용.
.param("amount", String.valueOf(amount))) // 숫자/날짜 등의 데이터도 등록할 때는 문자열로 변경해야 가능
.andExpect(status().isOk())
.andExpect(jsonPath("$.name",is(name))) // jsonPath : JSON 응답값을 필드별로 검증할 수 있는 메소드. $를 기준으로 필드명 명시.
.andExpect(jsonPath("$.amount", is(amount)));
}
}
JSON이 리턴되는 API 정상적으로 테스트 통과 확인
728x90
'기록 > 스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
Chapter 3. 프로젝트에 Spring Data JPA 적용하기 (0) | 2022.10.08 |
---|---|
Chapter 3. 스프링 부트에서 JPA로 데이터베이스 다뤄보기 (0) | 2022.10.07 |
Chapter 2. 스프링 부트에서 테스트 코드 작성 (0) | 2022.09.29 |
Chapter 2 - 롬복 소개 및 설치하기 (0) | 2022.09.24 |
Chapter 1. 인텔리제이에서 깃과 깃허브 사용하기 (0) | 2022.09.09 |