본문 바로가기
Clone Coding/스프링 부트와 AWS

[Spring] 테스트 코드 작성하기

by 연로그 2021. 1. 8.
반응형

Application 생성

먼저 패키지랑 가장 기본이 될 java 파일 하나를 만들자.

 

com.spaws.book.springboot 패키지를 만들고 그 안에 Application.java라는 파일을 생성했다.

보통 패키지명은 웹 사이트 주소의 역순으로 정한다.

(ex: admin.spaws.com -> com.spaws.admin)

spaws는 책이 spring boot와 aws 어쩌구라서 지은거고 이름이 달라도 상관 없다.

 

Application.java

@SpringBootApplication 
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

- 프로젝트의 메인 클래스

- @SpringBootApplication은 스프링 부트의 자동 설정, 스프링 Bean 읽기생성 자동으로 설정하므로 해당 클래스는 항상 프로젝트의 최상단에 위치해야 한다.

- SpringApplication.run()을 통해 내장 WAS 실행 -> 내장 WAS 존재로 인해 별도의 Tomcat 설치 필요 x

- 언제 어디서나 같은 환경에서 배포할 수 있기 때문에 스프링 부트는 내장 WAS 사용을 권장.

 

 

Controller 생성

앞으로의 Controller 관련 클래스를 담을 패키지를 생성한다. (com.spaws.book.springboot.web)

HelloController.java를 생성 후 다음 코드를 적는다.

@RestController
public class HelloController {
	@GetMapping("/hello")
	public String hello() {
		return "hello";
	}
}

@RestController

- JSON을 반환하는 컨트롤러

- 과거 @ResponseBody를 메소드마다 선언했던 것을 한 번만 선언할 수 있게 됨

 

@GetMapping

- HTTP 메소드 중 Get의 요청을 받을 수 있다.

- 과거: @RequestMapping(method=RequestMethod.GET)

 

 

ControllerTest 생성

위 컨트롤러는 src/main/java에 생성했었는데, 테스트 코드는 src/test/java에서 생성하자.

마찬가지로 com.spaws.book.springboot.web 패키지를 만들고 HelloControllerTest.java를 생성하자.

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
	@Autowired
	private MockMvc mvc; // 스프링 MVC 테스트의 시작점. GET/POST에 대한 API 테스트
	
	@Test
	public void hello_리턴() throws Exception {
		String hello = "hello";
		
		mvc.perform(get("/hello")) // /hello 주소로 HTTP GET 요청
				.andExpect(status().isOk())
				.andExpect(content().string(hello)); // hello가 맞는지 검증
	}
}

@RunWith(SpringRunner.class)

- 테스트 시, JUnit 외의 다른 실행자 실행

- Spring boot test와 JUnit 사이의 연결자 역할

 

@WebMvcTest

- Web(Spring MVC)에 집중할 수 있는 어노테이션

- @Controller, @ControllerAdvice, ... 사용 가능

- @Service, @Component, @Repository, ... 사용 불가

 

@Autowired

- 스프링이 관리하는 Bean 주입 받기

 

.andExpect(status().isOk())

- HTTP Header의 Status와 mvc.perform 결과 검증

  (HTTP Header Status: 200, 400, 404, 500, ... )

- .isOk()는 200인지 아닌지를 검증

 

 

테스트 결과

 

만약 get, status, content 메소드에 오류가 생긴다면 import를 먼저 확인해야 한다.

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;

Eclipse에서는 static import는 자동 인식을 못한다.

별도로 Favorites를 지정해서 사용할 수 있다는데 자세한 방법은 구글링 해볼 것.

 

 

롬복 전환하기

이제 위 코드를 롬복으로 전환할 것이다.

build.gradle의 dependencies에 다음 코드를 추가하고 빌드한다.

compile('org.projectlombok:lombok')

(Eclipse 롬복 최초 추가 후 설정: blog.naver.com/white_la/222177621109 )

 

 

com.spaws.book.springboot.web.dto에 HelloResponseDto.java를 생성했다.

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
	private final String name;
	private final int amount;
}

@Getter

- get 메소드 생성


@RequiredArgsConstructor

- final 필드가 포함된 생성자 생성 (final 없는 필드는 제외)

 

 

위와 유사한 폴더 구조로 test에 HelloResponseDtoTest.java를 만들어주자

public class HelloReponseDtoTest {
	@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은 Junit이 아닌 assertj이다. 

추가적인 라이브러리가 필요하지 않고 자동 완성 기능 이용에 편리해서 assertj를 더 자주 쓴다.

 

 

이제 HelloController에서 ReponseDto를 사용하는 메소드를 추가하자.

( Eclipse에서는 ctrl+shift+R을 누르면 파일명으로 파일을 찾을 수 있다. )

@GetMapping("/hello/dto")
public HelloResponseDto hello(@RequestParam("name") String name, @RequestParam("amount") int amount) {
	return new HelloResponseDto(name,amount);
}

@RequestParam

- 외부에서 AIP로 넘긴 파라미터를 가져온다

- 외부에서 name이라는 이름으로 넘긴 파라미터를 String name에 저장,

  외부에서 amount라는 이름으로 넘긴 파라미터를 int amount에 저장

 

 

HelloControllerTest도 수정해준다.

@RunWith(SpringRunner.class)
@WebMvcTest
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));
	}
	
	@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)) );
	}
}

param

- API 테스트 시 요청될 파라미터 지정

- 값은 String만 허용

 

jsonPath

- JSON 응답값 필드별로 검증할 수 있는 메소드

- $ 기준으로 필드명 명시

 

마찬가지로 import 오류가 날 경우엔 아래 추가

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.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;

 

HelloControllerTest를 실행 시키면 정상적으로 작동된다.


해당 게시글은 [ 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 / 이동욱 ] 책을 따라한 것을 정리하기 위한 게시글입니다. 요약, 생략한 부분이 많으니 보다 자세한 설명은 책 구매를 권장합니다.

반응형