반응형
해당 글은 스프링 부트와 AWS로 혼자 구현하는 웹 서비스라는 책을 읽고 핵심 내용을 정리하기 위해 작성하는 글입니다.
02장 스프링 부트에서 테스트 코드를 작성하자
1️⃣ 테스트 코드는 왜 작성해야 할까?
- 개발단계 초기에 문제를 발견하게 도와준다.
- 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있다.
- 기능에 대한 불확실성을 감소시킬 수 있다.
- 시스템에 대한 실제 문제를 제공한다. 즉, 단위 테스트 자체가 문서로 사용할 수 있다.
2️⃣ 주요 Annotation 설명
@SpringBootApplication
- 스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정.
- 해당 어노테이션이 있는 위치부터 설정을 읽어가기 때문에 항상 프로젝트의 최상단에 위치해야 한다.
- SpringApplication.run 함수로 내장 WAS를 실행할 수 있다. 항상 서버에 톰캣을 설치할 필요가 없게 된다. 스프링 부트로 만들어진 Jar파일로 실행하면 된다. '언제 어디서나 같은 환경에서 스프링 부트를 배포'할 수 있다는 장점이 있다.
@RestController
- 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 준다.
- @Contoller + @ResponseBody
@GetMapping
- HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어 준다.
@RequestParam
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount){
return new HelloResponseDto(name, amount);
}
- 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션
- 외부에서 name(@RequestParam("name"))이란 이름으로 넘긴 파라미터를 메소드 파라미터 name(String name)에 저장한다.
3️⃣ 테스트 코드 작성 및 주요 Annotation
일반적으로 테스트 클래스는 대상 클래스 이름에 Test를 붙입니다.
package com.springbook.kdy.inhaspringstudy;
import com.springbook.kdy.inhaspringstudy.web.HelloController;
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.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class) // ①
@WebMvcTest(controllers = HelloController.class,
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE)
}
)
public class HelloControllerTest {
@Autowired // ②
private MockMvc mvc; // ③
@Test
public void hello가_리턴된다() throws Exception {
String hello = "hello";
mvc.perform(get("/hello")) // ④
.andExpect(status().isOk()) // ⑤
.andExpect(content().string(hello));
}
}
① @RunWith(SpringRunner.class)
- 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다.
- 여기서는 SpringRunner라는 스프링 실행자를 사용한다.
- 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 한다.
② @Autowired
- 스프링이 관리하는 빈(Bean)을 주입 받는다.
③ private MockMvc mvc
- 웹 API를 테스트할 때 사용한다.
- 스프링 MVC 테스트의 시작점이다.
- 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있다.
④ mvc.perform(get(”/hello”))
- mvc.perform의 결과를 검증한다.
- HTTP Header의 Status를 검증한다.
⑤ .andExpect().string(hello)
- mvc.perform의 결과를 검증한다.
- 응답 본문의 내용을 검증한다.
4️⃣ 라이브러리 롬복
롬복은 자바 개발할 때 자주 사용되는 코드 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성해 준다.
package com.springbook.kdy.inhaspringstudy.web.dto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter // ①
@RequiredArgsConstructor // ②
public class HelloResponseDto {
private final String name;
private final int amount;
}
① @Getter
- 선언된 모든 필드의 get 메소드를 생성한다.
② @RequiredArgsConstructor
- 선언된 모든 final 필드가 포함된 생성자를 생성해 준다.
- final이 없는 필드는 생성자에 포함되지 않는다.
이때 final은 처음 정의된 상태가 변하지 않는 것을 보장
반응형
'Java > Spring' 카테고리의 다른 글
[Spring] 비즈니스 로직을 처리하는 패턴 (0) | 2023.03.31 |
---|---|
[Spring] Model 객체와 @ModelAttribute 어노테이션 (0) | 2023.03.25 |
[Spring] Spring vs Spring Boot (0) | 2023.03.22 |
[Spring] Spring 프로젝트 생성하기 (0) | 2023.03.20 |
[Spring] A problem occurred configuring root project '...' 에러 해결 (0) | 2023.03.20 |