본문 바로가기

Java/Spring

[Spring] 롬복(Lombok) 라이브러리 테스트 코드 생성

반응형

앞서, 생성한 롬복(Lombok) 라이브러리 설치가 완료되었다면 롬복이 잘 실행되는지 관련된 테스트 코드를 만들어 보도록 하겠다.

 

✭ [참고]  https://chati.tistory.com/66

 

[Spring] 롬복(Lombok) 라이브러리 설치

Java 개발자들의 필수 라이브러리 롬복(Lombok)은 다양한 어노테이션을 자동 생성해줍니다. 롬복(Lombok) 설치 방법 1. 의존성 추가 프로젝트 내 build.gradle 파일에 lombok 관련 의존성을 추가한다. - build.gra..

chati.tistory.com


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

 

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

 

projectlombok.org

 


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

 

[Spring] 간단한 API 생성 및 테스트 코드(MockMvc이용) 해보기

테스트 코드를 하기 위해 간단한 API를 생성해보도록 하겠습니다. ⭐︎ Spring 프로젝트를 이미 생성된 상태에서 진행됩니다. ⭐︎ SpringBoot를 통한 어노테이션으로 API 설정을 진행합니다. 1. 간단한 API 생성..

chati.tistory.com


 

반응형

❥ CHATI Github