728x90
프로젝트 중 "상품 전체 검색" service 레이어를 단위테스트 하는 과정에서 Page 에 대한 내용을 어떻게 mock 으로 주입해야하는지에 대해 알아보았다.
테스트할 서비스는 아래와 같다.
@Override
@Transactional(readOnly = true)
public List<GoodsResponse> goodsFindAll(Pageable pageable) {
Page<Goods> goods = goodsRepository.findAll(pageable);
List<GoodsResponse> list = new ArrayList<>();
for (Goods good : goods) {
list.add(GoodsResponse.toGoodsResponse(good));
}
return list;
}
JUnit5 와 mock 을 이용해서 테스트코드를 작성한 내용은 아래와 같다.
Page를 willReturn 으로 반환되는 값으로 변환시키기 위해서는 PageImpl 을 이용해야한다.
이유는 Page 는 인터페이스이기 때문에, 인터페이스의 구현체를 찾아 해결했다.
List<Goods> 를 이용해 ArrayList를 만들고, list에 넣고 싶은 goods 를 추가한다.
new PageImpl을 통해서 만들어진 goodsList 를 생성해 PageImpl 타입의 객체를 만들고 willReturn에 결과값으로 넣어주었다.
@Test
@DisplayName("상품 전체 조회")
void goodsFindAll() {
//given
Goods goods = GoodsFactory.createGoods();
Pageable pageable = PageRequest.of(0, 10, Sort.Direction.DESC, "id");
List<Goods> goodsList = new ArrayList<>();
goodsList.add(goods);
PageImpl<Goods> goodsPage = new PageImpl<>(goodsList);
given(goodsRepository.findAll(pageable)).willReturn(goodsPage);
//when
List<GoodsResponse> goodsResponses = goodsService.goodsFindAll(pageable);
//then
assertThat(goodsResponses.size()).isEqualTo(1);
}
728x90
'TEST' 카테고리의 다른 글
동시성 이슈 해결 방법 (synchronized , redis Lock, MySQL Lock) (0) | 2024.02.18 |
---|---|
성능테스트 (with Locust) (0) | 2024.02.17 |
spring boot 빌드 시, 특정 테스트 제외하기 (0) | 2023.01.19 |
@RequestPart MultipartFile , Json 컨트롤러 통합 테스트 (0) | 2023.01.07 |
댓글