본문 바로가기

내일 배움 캠프

2024-01-10

오늘은 프로젝트 7일 차이다. 오늘 진행한 내용은 다음과 같다.

1. 공연 추가 API Test 코드 작성 및 공연 회차별 좌석 기능 구현 진행

 

공연 추가 API TEST 코드를 작성하다 보니 테스트 코드 자체에서 문제가 있었는데 GoodsEntity를 생성할 때 연관 관계가 맺어 있는 Entity를 추가하고 보니 공연 추가 API에서는 Respone에 대한 응답값이 없어서 테스트를 할 때 어떤 방식으로 진행해야 되는지 고민이 됐다. 여러 찾아보니 API자체 안에 있는 각 메서드의 기능들을 더 쪼개서 단위테스트를 진행하면 된다고 해서 여러 설정을 마치고 단위테스트를 진행했다.

 

Service 단위 테스트를 진행하면서 제일 문제가 됐던 부분은 공연을 생성할 때 공연만 생성하는 것이 아니라 여러 연관관계에 있는 Entity까지 동시에 생성을 하다 보니 코드를 작성하다가 실수해서 테스트 실패를 밥먹듯이 하다 1시간 만에 하나의 API에 대한 테스트를 마무리했다. 

원인은 연관관계가 너무 깊숙하게 연결되어 있다보니 다른 서비스레이어에서 사용하는 Repository를 Given을 통해 얻고 싶은 데이터를 미리 원하는 결과에 대해 설정하고 결과를 얻어야 하지만 찾지 못한 하나의 save 쿼리문 덕에 실행을 하고 나서 Goods Entity의 특정 필드값이 null로 변해 테스트에 실패했다. 결론은 연관관계가 깊으면 깊을수록 천천히 꼼꼼하게 확인하면서 테스트를 진행할 필요성을 느꼈다.

@Test
void 공연_공연이미지_공연카테고리_회차_생성_테스트() {
    // given
    Place place = Mockito.mock();
    Goods goods = goodsRequest.toEntity(place);

    List<String> fileUrl = new ArrayList<>();
    fileUrl.add("goods/thumbnail/1/51579925-f563-21dd-4578-e2264dadbdab");
    fileUrl.add("goods/general/1/0aacdd4f-b2e5-4zbc-b8e8-a10c4b8f2c17");

    List<GoodsImage> goodsImage = new ArrayList<>();
    goodsImage.add(GoodsImage.builder().s3Key(fileUrl.get(0)).type("대표").goods(goods).build());
    goodsImage.add(GoodsImage.builder().s3Key(fileUrl.get(1)).type("일반").goods(goods).build());

    goods.addGoodsImage(goodsImage);
    GoodsCategory goodsCategory = GoodsCategory.builder().name("공연").build();
    goods.updateGoodsCategory(goodsCategory);

    List<Sequence> sequenceList = new ArrayList<>();
    sequenceList.add(
       Sequence
          .builder()
          .sequence(1)
          .startDateTime(
             LocalDateTime.of(2023, 3, 1, 15, 0, 0))
          .goods(goods)
          .build()
    );
    sequenceList.add(
       Sequence
          .builder()
          .sequence(2)
          .startDateTime(
             LocalDateTime.of(2023, 3, 2, 15, 0, 0))
          .goods(goods)
          .build()
    );

    // when
    given(placeService.findPlace(1L)).willReturn(place);
    given(goodsService.saveGoods(any(Goods.class))).willReturn(goods);
    given(s3Uploader.uploadFileToS3(any(), any())).willReturn(Collections.singletonList(fileUrl.get(0)));
    given(s3Uploader.uploadSingleFileToS3(any(), any())).willReturn(fileUrl.get(1));
    given(goodsService.saveGoodSCategory(any())).willReturn(goodsCategory);
    adminService.createGoodsAndSequence(goodsRequest, 1L, mock());

    // then
    verify(placeService, times(1)).findPlace(anyLong());
    verify(goodsService, times(1)).saveGoods(any(Goods.class));
    assertEquals(goodsImage.get(0).getS3Key(), goods.getGoodsImage().get(0).getS3Key());
    assertEquals(goodsImage.get(1).getS3Key(), goods.getGoodsImage().get(1).getS3Key());
    assertEquals(goodsImage.get(0).getType(), goods.getGoodsImage().get(0).getType());
    assertEquals(goodsImage.get(1).getType(), goods.getGoodsImage().get(1).getType());
    assertEquals(goodsCategory.getName(), goods.getGoodsCategory().getName());
    assertEquals(sequenceList.get(0).getGoods().getName(), goods.getName());
    assertEquals(sequenceList.get(1).getGoods().getName(), goods.getName());
    assertEquals(sequenceList.get(1).getStartDateTime().getHour(), goodsRequest.getStartTime().getHour());
    assertEquals(sequenceList.get(1).getStartDateTime().getMinute(), goodsRequest.getStartTime().getMinute());
}

 

 

추가적으로 공연 회차별 좌석 기능을 진행했다. 기능 구현은 어느 정도 완료한 상태이고 테스트 코드 작성하여 테스트 진행 후에 실제로 테스트를 완료하고 마무리할 예정이다.

'내일 배움 캠프' 카테고리의 다른 글

2024-01-12  (1) 2024.01.13
2024-01-11  (0) 2024.01.12
2024-01-09  (0) 2024.01.10
2024-01-08  (2) 2024.01.09
2024-01-05  (0) 2024.01.06