스프링 부트에서 테스트코드 작성
TDD(테스트 주도 개발) 와 단위테스트(Unit Test) 는 다르다
HelloResponseDto.java 와 테스트 코드인 HelloResponseDtoTest.java
package com.anse.book.springboot.web.dto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
// 선언된 모든 필드의 get 메서드를 생성
// final로 선언된 모든 필드가 포함된 생성자를 생성
public class HelloResponseDto {
private final String name;
private final int amount;
}
package com.anse.book.springboot.web.dto;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloResponseDtoTest {
public void rombokTest() {
String name = "test";
int amount = 1000;
HelloResponseDto dto = new HelloResponseDto(name, amount);
assertThat(dto.getName()).isEqualTo(name);
assertThat(dto.getAmount()).isEqualTo(amount);
/*
assertThat
- assertj 라는 테스트 검증 라이브러리의 검증 메서드
- 검증하고 싶은 대상을 메서드 인자로 받음
- 메서드 체이닝이 지원되어 isEqualTo와 같이 이어서 사용 가능
isEqualTo
- assertj의 동등 비교 메서드
- 두개의 값이 같을 때만 성공
*/
}
}
HelloController.java 와 테스트 코드인 HelloControllerTest.java
package com.anse.book.springboot.web;
import com.anse.book.springboot.web.dto.HelloResponseDto;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
public class HelloController {
"/hello") (
public String hello() {
return "hello";
}
"/hello/dto") (
public HelloResponseDto helloDto( ("name") String name, ("amount") int amount) {
return new HelloResponseDto(name, amount);
}
}
package com.anse.book.springboot.web;
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라는 스프링 실행자를 실행
@WebMvcTest
- Web(Spring MVC) 에 집중할 수 있는 어노테이션
- @Controller, @ControllerAdvice 등을 사용할 수 있으나 @Service, @Component, @Repository는 사용 못함
*/
SpringRunner.class) (
public class HelloControllerTest {
private MockMvc mvc; // 웹 API 테스트 할 때 사용하고 스프링 MVC테스트의 시작점
// 이를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있다
public void hello() throws Exception {
String hello = "hello";
mvc.perform(get("/hello")) // MockMvc를 통해 /hello 주소로 HTTP get 요청
.andExpect(status().isOk()) // HTTP Header의 Status를 검증 (200인지)
.andExpect(content().string(hello));// 응답 본문의 내용을 검증
// Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는지 검증
}
public void helloDto_return() 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 응답값을 필드별로 검증할 수 있는 메서드
- $를 기준으로 필드명을 명시하니 $.name,$.amount로 검증
*/
}
}
어노테이션 정리
@Getter
선언된 모든 필드의 get메서드를 생성
@ReqiredArgsConstructor
final로 선언된 모든 필드가 포함된 생성자를 생성
@RunWith(SpringRunner.class)
스프링부트 테스터와 Junit사이에 연결자 역할
SpringRunner라는 스프링 실행자를 실행
@webMvcTest
Web(Spring MVC) 에 집중할 수 있는 어노테이션
@Controller, @ControllerAdvice 등을 사용할 수 있고
@Service, @Component, @Repository 는 사용 못함
'DEV > Spring' 카테고리의 다른 글
[SpringBoot] 빈 주입은 @Autowired 대신에 생성자로 주입하라 (@RequiredArgsConstructor) (0) | 2020.02.20 |
---|---|
[SpringBoot] 비지니스 로직은 Service에서 처리하는것이 아니다. (1) | 2020.02.18 |
[JPA] 스프링부트 쿼리 로그보기 (0) | 2020.02.18 |
[JPA] JPA 세팅, h2(인메모리 관계형 데이터 베이스), 어노테이션정리 (0) | 2020.02.18 |
[SpringBoot]Gradle 프로젝트를 스프링부트 프로젝트로 변경 (0) | 2020.02.17 |