이 글은 이동욱 님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 책을 읽으며 정리한 글입니다.
TDD란, 테스트가 주도하는 개발을 말한다. 테스트 코드를 먼저 작성하는 것부터 시작한다. 반면 단위 테스트는 TDD의 첫 번째 단계인 기능 단위의 테스트 코드를 작성하는 것을 말한다.
단위 테스트는 개발 단계 초기에 문제를 발견하도록 돕고, 나중에 코드를 리팩토링 하는 등 코드 변경이 있을 때 기존 기능이 올바르게 작동하는지 쉽게 확인이 가능해서 안전하다. 또한 Postman 같은 API 테스트 도구로 하나하나 테스트 하는 번거로움을 줄일 수 있어서 효율적이다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 앞으로 만들 프로젝트의 메인 클래스이다. 설정을 읽는 시작점이므로 항상 프로젝트 최상단에 위치해야 한다.
- @SpringBootApplication: 스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 자동으로 설정한다.
- SpringApplication.run으로 내장 WAS를 실행한다. (서버에 톰캣을 설치할 필요가 없고, Jar 파일로 실행하면 된다.)
@ExtendWith(SpringExtension.class) // junit5
@WebMvcTest(controllers = HelloController.class,
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SecurityConfig.class)
}
)
public class HelloControllerTest {
@Autowired // 스프링이 관리하는 빈을 주입받는다.
private MockMvc mvc;
@Test
public void hello가_리턴된다() throws Exception {
String hello = "hello";
mvc.perform(get("/hello")) // HTTP GET 요청
.andExpect(status().isOk()) // 결과 검증
.andExpect(content().string(hello));
}
}
- @ExtendWith: Mockito의 Mock 객체를 사용하기 위한 어노테이션이다.
- @WebMvcTest: Web(Spring MVC)에 집중할 수 있는 어노테이션이다. @Controller, @ControllerAdvice를 사용할 수 있다. @Service, @Component, @Repository는 사용할 수 없다. JPA 기능이 작동하지 않는다. JPA 기능까지 한 번에 테스트하려면 @SpringBootTest와 @TestRestTemplate를 사용한다.
- MockMvc: 웹 API를 테스트 할 때 사용하며(HTTP GET, POST 등), 스프링 MVC 테스트의 시작점이다.
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);
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
- assertThat: 검증 라이브러리 assertj의 검증 메서드로, 검증하고 싶은 대상을 메소드 인자로 받는다.
- isEqualTo: assertj의 동등 비교 메소드이다. assertThat에 있는 값과 비교해서 같을 경우 성공한다.
@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)));
}
- jsonPath: JSON 응답값을 필드별로 검증한다. $를 기준으로 필드명을 명시한다.
- @RestController: 컨트롤러를 JSON을 반환하는 컨트롤러로 만든다. @ResponseBody를 한 번에 사용할 수 있게 한다.
- @RequiredArgsConstructor: 선언된 모든 final 필드가 포함된 생성자를 생성한다. final이 없으면 포함되지 않는다.
'Book > 스프링 부트와 AWS 웹 서비스' 카테고리의 다른 글
[AWS] 서버 환경 구성하기 - EC2 (0) | 2023.02.22 |
---|---|
JUnit 테스트에 Spring Security 적용하기 (0) | 2023.02.22 |
스프링 시큐리티와 OAuth 2.0으로 로그인 기능 구현하기 (feat. Google, Naver) (0) | 2023.02.17 |
머스테치(Mustache)로 화면 구성하기 (0) | 2023.02.10 |
[Spring Boot] JPA로 데이터베이스 다루기 (0) | 2023.02.09 |
댓글