앞서, 생성한 롬복(Lombok) 라이브러리 설치가 완료되었다면 롬복이 잘 실행되는지 관련된 테스트 코드를 만들어 보도록 하겠다.
✭ [참고] https://chati.tistory.com/66
1. 롬복(Lombok)을 이용해 DTO 생성
- main/java/.../dto/SimpleResponse.java
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter //(1)
@RequiredArgsConstructor //(2)
public class SimpleResponse {
private final String name;
private final int amount;
}
(1) @Getter
- 선언된 모든 필드의 get 메소드를 생성한다.
(2) @RequiredArgsConstructor
- 선언된 모든 final 필드가 포함된 생성자를 생성한다.
- final이 없는 필드는 생성자에 포함되지 않는다.
- 참고: https://projectlombok.org/features/constructor
2. 새로 생성한 DTO를 테스트 코드에 활용
- test/java/.../dto/SimpleResponseTest.java
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat; // (1)
public class SimpleResponseTest {
@Test
public void lombokTest() {
String name = "test";
int amount = 1000;
SimpleResponse simpleResponse = new SimpleResponse(name, amount);
assertThat(simpleResponse.getName()).isEqualTo(name); // (2)
assertThat(simpleResponse.getAmount()).isEqualTo(amount);
}
}
(1) assertThat
- assertj 라는 테스트 검증 라이브러리의 검증 메소드입니다.
- 검증하고 싶은 대상을 메소드 인자로 받습니다.
(2) isEqualTo
- assertj 의 동등 비교 메소드 입니다.
- assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을때만 성공입니다.
✶ 여기서 잠깐! assertj 테스트 라이브러리의 장점은??
- CoreMathers와 달리 추가적으로 라이브러리가 필요하지 않습니다.
- 자동완성이 Junit 보다 확실하게 지원됩니다.
3. DTO에 대한 테스트 코드 실행 결과
그러나, 위에 따른대로 실행하게 되면 테스트 코드에서 아래와 같이 실패된 메시지를 볼 수 있을 것입니다... 😢
Testing started at ...
> Task :cleanTest UP-TO-DATE
> Task :compileJava FAILED
/Users/jenny/IdeaProjects/moimone/src/main/java/com/moimone/web/dto/SimpleResponse.java:10: error: variable name not initialized in the default constructor
private final String name;
^
/Users/jenny/IdeaProjects/moimone/src/main/java/com/moimone/web/dto/SimpleResponse.java:11: error: variable amount not initialized in the default constructor
private final int amount;
^
2 errors
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.
...
아무리 봐도 틀린 부분이 없는데...
몇시간을 찾아보고 나니 해답은 gradle.build에 있었더군요.
- gradle.build
...
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.projectlombok:lombok')
annotationProcessor('org.projectlombok:lombok')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.projectlombok:lombok')
testAnnotationProcessor('org.projectlombok:lombok')
}
...
위와 같이 롬복 관련된 설정되어 있는지 확인해 주세요.
⌗ 추가 코드
- annotationProcessor('org.projectlombok:lombok')
- testCompile('org.projectlombok:lombok')
- testAnnotationProcessor('org.projectlombok:lombok')
그리고 다시 실행을 하게 되면 아래 화면과 같이 성공된 화면을 볼 수 있습니다.
4. 새로 생성한 DTO를 API로 만들어 테스트 코드 작성
- main/java/.../web/SimpleController.java
import com.moimone.web.dto.SimpleResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SimpleController {
@GetMapping("/simple/response")
public SimpleResponse helloResponse(@RequestParam("name") String name, @RequestParam("amount") int amount) {
return new SimpleResponse(name, amount);
}
}
@RequestParam
- 외부에서 API로 넘긴 파라미터를 가져온다.
- 여기서 외부에서 name 및 amount 이란 이름으로 넘긴 파라미터를 String namd 및 int amount에 저장하게 된다.
- test/java/.../web/SimpleControllerTest.java
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.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@WebMvcTest
public class SimpleControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void returnSimpleResponse() throws Exception {
String name = "helloWorld";
int amount = 1000;
mvc.perform(get("/simple/response")
.param("name", name) //(1)
.param("amount", String.valueOf(amount)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name", is(name))) //(2)
.andExpect(jsonPath("$.amount", is(amount)));
}
}
(1) param
- API 테스트할 때 사용하는 요청 파라미터를 설정합니다.
- 단, String 타입만 가능하여 숫자 등의 데이터를 등록할때는 문자열로 변경해야합니다.
(2) jsonPath
- JSON 응답값을 필드별로 검증할 수 있는 메소드 입니다.
- $를 기준으로 필드명을 명시합니다.
5. API에 대한 테스트 코드 실행 결과
성공
✭ [참고] 테스트 코드의 기본 내용 : https://chati.tistory.com/65
'Java > Spring' 카테고리의 다른 글
[Spring] 게시판 만들기 : 등록/수정/조회 API - Spring Data Jpa 이용 (0) | 2020.02.14 |
---|---|
[Spring] 게시판 만들기 : 적용한 Spring Data JPA 테스트 코드 작성 (6) | 2020.02.13 |
[Spring] 게시판 만들기 : Spring Data JPA 적용 (0) | 2020.02.12 |
[Spring] 롬복(Lombok) 라이브러리 설치 (0) | 2020.02.11 |
[Spring] 간단한 API 생성 및 테스트 코드(MockMvc이용) 해보기 (0) | 2020.02.02 |
[SpringBoot] @SpringBootApplication 어노테이션 설명 (0) | 2020.02.02 |