[TIL] 23.04.25 검색기능 단위테스트 + 페이징 처리(mockito)

hyewon jeong·2023년 4월 23일
0

TIL

목록 보기
121/138

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 로 코드 커버리지 측정

profile
개발자꿈나무

0개의 댓글