1. 검색 조회 기능 코드 (페이징 처리포함)
@Override
public Result searchByKeyword(String keyword, int page, int size,
Direction direction, String properties) {
String question = keyword;
String answer = keyword;
Page<Faq> faqListPage = faqRepository.findAllByQuestionContainingIgnoreCaseOrAnswerContainingIgnoreCase(question,
answer, PageRequest.of(page - 1, size, direction, properties));
return pageProcessing(faqListPage, page, size);
}
//페이지 처리를 위한 메서드
public Result pageProcessing(Page<Faq> faqListPage, int page, int size) {
int totalCount = (int) faqListPage.getTotalElements();
if (faqListPage.isEmpty()) {
throw new CustomException(ExceptionStatus.POST_IS_EMPTY);
}
List<FaqResponse> faqResponses = faqListPage.stream().map(FaqResponse::new)
.toList();
int countList = size;
int countPage = 5;//todo 리팩토링때 10으로 변경예정
int totalPage = totalCount / countList;
if (totalCount % countList > 0) {
totalPage++;
}
if (totalPage < page) {
page = totalPage;
}
return new Result(page, totalCount, countPage, totalPage, faqResponses);
}
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public static class Result<T> {
private int page;
private int totalCount;
private int countPage;
private int totalPage;
private T data;
public Result(int page, int totalCount, int countPage, int totalPage, T data) {
this.page = page;
this.totalCount = totalCount;
this.countPage = countPage;
this.totalPage = totalPage;
this.data = data;
}
}
2. mockito 이용한 단위 테스트
2-1. when(faqRepository.findAllByQuestionContainingIgnoreCaseOrAnswerContainingIgnoreCase(....).thenReturn( ???)
- 목킹하여 페이징 처리된 Page 객체 를 어떻게 반환하지??
Page도 안되어 여러가지 해본 결과
// PageImpl 객체 생성
List<Faq> faqList = new ArrayList<>();
faqList.add(faq);
PageImpl<Faq> pageImpl = new PageImpl<>(faqList);
// mock 객체에 PageImpl 반환하도록 설정
when(faqRepository.findAllByQuestionContainingIgnoreCaseOrAnswerContainingIgnoreCase(question,
answer, PageRequest.of(page - 1, size, direction, properties))).thenReturn(pageImpl);
- PageImpl은 Page 인터페이스를 구현한 클래스 중 하나이다. 따라서 PageImpl 객체를 생성하여 thenReturn() 메서드의 인자로 전달하는 것은, Page 인터페이스의 구현체 중 하나인 PageImpl 객체를 반환하도록 설정하는 것과 같다.
@Test
@DisplayName("FAQ _대소문자 구분 없이 질문 검색조회(questionContaining)")
void searchByKeyword_questionContaining_success() {
//given
String keyword = "keyword";
String question = keyword;
String answer = keyword;
int page = 1;
int size = 1;
Direction direction = Direction.DESC;
String properties = "createdDate";
FaqRequest faqRequest = new FaqRequest("KEYWORD", "키워드");
Faq faq = faqRequest.toEntity(1L);
FaqRequest faqRequest1 = new FaqRequest("keyword", "키워드");
Faq faq1 = faqRequest1.toEntity(1L);
//Page<Faq> 객체를 반환하도록 설정
List<Faq> faqList = new ArrayList<>();
faqList.add(faq);
faqList.add(faq1);
PageImpl<Faq> pageImpl = new PageImpl<>(faqList);
when(faqRepository.findAllByQuestionContainingIgnoreCaseOrAnswerContainingIgnoreCase(question,
answer, PageRequest.of(page - 1, size, direction, properties))).thenReturn(pageImpl);
//when
Result response = faqServiceImpl.searchByKeyword(keyword, page, size, direction, properties);
//then
assertThat(response.getTotalCount()).isEqualTo(2);
}
3. jacoco 로 코드 커버리지 측정