Chapter 02. 스프링 부트에서 테스트 코드를 작성하자 - DoDaek/freelec-springboot2-webservice GitHub Wiki
- 테스트 코드를 작성하는 이유
- 단위 테스트는 개발단계 초기에 문제를 발견하게 도와줍니다.
- 단위 테스트는 개발자가 나중에 코드를 리팩토링하거나 라이브러리를 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있습니다.
- ex. 회귀 테스트
- 단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있습니다.
- 단위 테스트는 시스템에 대한 실제 문서를 제공합니다. 즉, 단위 테스트 자체가 문서로 사용할 수 있습니다.
- Application 클래스
- 현재 프로젝트에서는
Application
이라는 이름으로 작성했습니다. - 프로젝트의 메인 클래스가 됩니다.
@SppringBootApplication
으로 인해 스프링 부트의 자동설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정됩니다.main
메소드에서 실행하는SpringApplication.run
으로 인해 내장 WAS를 실행합니다.- WAS: Web Application Server
- 내장 WAS란 별도로 외부에 WAS를 두지 않고 애프리케이션을 실행할 때 내부에서 WAS를 실행하는 것을 이야기합니다.
- 항상 서버에 톰캣을 설치할 필요가 없게 되고, 스프링 부트로 만들어진 Jar 파일로 실행하면 됩니다.
- 현재 프로젝트에서는
- 내장 WAS를 사용하는 이유
- 스프링 부트에서만 내장 WAS를 사용할 수 있는 것은 아니지만, 스프링 부트에서는 내장 WAS를 사용하는 것을 권장합니다.
- '언제 어디서나 같은 환경에서 스프링 부트를 배포'할 수 있기 때문입니다.
- 테스트 클래스
- 작성한 코드가 제대로 작동하는지 테스트하기 위한 클래스입니다.
- 테스트 코드로 검증합니다.
- 작성한 코드가 있던 패키지를 그대로 test 디렉토리에 생성하여 클래스 파일을 만들어줍니다.
- 일반적으로 테스트 클래스는 대상 클래스 이름에
Test
를 붙입니다. - 수동으로 검증하지 않기 위해서 필요합니다.
- 브라우저로 한 번씩 검증은 하되, 테스트 코드를 작성하고 테스트 후 브라우저로 검증합시다!
- 롬복
- 자바 개발자들의 필수 라이브러리 롬복( Lombok )입니다.
- 자바 개발할 때 자주 사용하는 코드
Getter
,Setter
, 기본생성자,toString
등을 어노테이션으로 자동 생성해 줍니다. - 프로젝트에 롬복을 추가합니다.
build.gradle
에compile('org.projectlombok:lombok')
을 추가합니다.- Intellij에서 사용할 때 추가적인 설정이 필요로 합니다.
lombok
plugin 설치- Preferences > Build, Execution, Deployment > Compiler > Annotation Processor에 있는
Enable annotation processing
체크
- 롬복으로 리팩토링하기
- 모든 응답 Dto를 추가할 dto 패키지를 만듭니다.
- 롬복이 정상적으로 작동하는지 확인하기 위해
HelloResponseDto
를 만들어서 확인해봅시다. - 확인하는 방법은 역시 테스트 클래스를 만들어서 테스트 코드를 작성하는 것 입니다.
- 테스트 코드 주의할 점
- JUnit의 기존
assertThat
이 아닌 assertj의assertThat
을 사용합니다.
- JUnit의 기존
- assertj를 사용하는 이유
- CoreMatchers와 달리 추가적으로 라이브러리가 필요하지 않습니다.
- JUnit의
assertThat
을 쓰게 되면is()
와 같이 CoreMatchers 라이브러리가 필요합니다.
- JUnit의
- 자동완성이 좀 더 확실하게 지원됩니다.
- IDE에서는 CoreMatchers와 같은 Matcher 라이브러리의 자동완성 지원이 약합니다.
- CoreMatchers와 달리 추가적으로 라이브러리가 필요하지 않습니다.
- Gradle 버전에 따른 오류
- 현재 최초로 프로젝트를 만들면 기본적으로 gradle 버전 6대가 설치되어 있습니다.
- 발생 오류( p.74 )
오류설명: HelloResponseDto.java 와 관련하여 HelloResponseDtoTest.java를 실행하는 도중, 아래와 같은 오류가 발생합니다.
private final String name; private final int amount;
error: variable name not initialized in the default constructor private final String name;
- Gradle 버전에 따른 오류 해결방법
- Gradle 버전 다운그레이드
- 실제 책에서 사용한 버전인 4.10.2 버전으로 다운그레이드를 한다.
gradlew wrapper --gradle-version 4.10.2
명령어를 사용하면 다운그레이드할 수 있다.
- build.gradle 수정
- gradle 5 이상부터 어노테이션을 구별해서 추가해야 합니다.
dependencies { compileOnly 'org.projectlombok:lombok:1.18.16' annotationProcessor 'org.projectlombok:lombok:1.18.16' testCompileOnly 'org.projectlombok:lombok:1.18.16' testAnnotationProcessor 'org.projectlombok:lombok:1.18.16' }
- Gradle 버전 다운그레이드