Test Code
팀원들과 협업하는 상황이라면, 내가 작성한 코드를 타 팀원이 모두 이해하는 것은 어려울 수 있다. 하지만 개발자도 사람이므로 내 코드가 요구사항에 맞게 잘 작성되었는지 확인하기 위해 merge 이전 꼭 확인을 해봐야한다. 확인을 할 수 있는 대표적인 방법이 Test Code이다.
이전 프로젝트에서는 Test Code를 작성하지 않고, main.java를 만드어서 직접 print를 해보는 단순한 작업만 거쳐왔었다. 하지만, 해당 과정을 정리해서 팀원들에게 보여줄 수는 없었기에 항상 테스트는 개인이 진행했었는데 Test Code를 작성하면 협업이 가능하다는 점을 깨닫게 되었다.
팀에서 진행한 전반적인 Test 방법은 다음과 같다.
❓
Test Code 작성 방법
- 테스트 코드 작성 시 확인이 용이하도록 규칙을 정해 준수하도록 한다.
- 테스트 분기 시 @Nested 를 적용하여 inner class를 작성한다.
- @DisplayName(””)를 활용하여 팀원들이 테스트 결과를 확인하기 용이하도록 한다.
- class name rules
- Feature Prefix :
Context_
- Dto Validation 검증 Prefix :
Element_
- Feature Prefix :
- method name rules
- _willSuccess()
- ex) _willSuccess()
- _willFail()
- ex) fileNotFound_willFail()
- _willSuccess()
팀원으로부터 Mockito를 활용한 Unit Test를 추천받아, 이번 프로젝트는 해당 프레임워크를 사용해 Test를 진행했다.
❓
Mockito를 이용한 Unit Test
Mockito란?
- 자바 단위테스트에서 가짜 객체를 지원해주는 프레임워크
- Mock 객체 생성, Mock 객체 동작을 지정, 테스트 대상 로직이 제대로 수행되었는지 확인
Mockito는 언제 사용되는가?
- 메소드가 return을 하기까지는 자세하고 긴 로직들을 거침
- 로직이 완성되지 않았고, 전부 구현이 무리일 경우 mock 사용
- Spring boot 진영에서 가장 많이 사용되는 프레임워크
DependenciestestImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' testImplementation group: 'org.mockito', name: 'mockito-core', version: '5.5.0' testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: '5.5.0'
Example@ExtendWith(MockitoExtension.class) //Mockito 테스트 실행을 확장 public class ItineraryServiceTest { TripService tripService = new TripService(); ItineraryService itineraryService = new ItineraryService(); @Mock //Mock 대상자 선정 ItineraryService mockItineraryService = new ItineraryService(); @Nested @DisplayName("getItineraryListFromJson()은") class Context_getItineraryListFromJson { @Test @DisplayName("특정 여행의 여정 기록을 조회할 수 있다.") void _willSuccess() throws IOException, ItineraryException, CsvRequiredFieldEmptyException, CsvDataTypeMismatchException { // given // Test를 위해 조회할 파일 생성 createFileJSON(); List<ItineraryDTO> itineraryList = new ArrayList<>(); itineraryList.add(ItineraryDTO.builder().id(1).build()); lenient().when(mockItineraryService.getItineraryListFromJson(999)) .thenReturn(itineraryList); //getItineraryListFromJson(999)를 하면, itineraryList를 반환해라 // when List<ItineraryDTO> result = itineraryService.getItineraryListFromJson(999); //result <- 반환한 itineraryList를 담는다. // then tripService.deleteTripFromJson(999); Assertions.assertEquals(result.get(0).getId(), itineraryList.get(0).getId()); //result 자체가 itineraryId가 1인 객체가 담긴 itineraryList를 받았으므로 true !!! }
Uploaded by N2T