티스토리 뷰
지금 까지 구현된 기능별로 테스트 코드를 작성해서
코드의 신뢰성을 향상시키고, 코드의 품질을 높일 것이다.
나는 공연 정보에 대한 조회를 테스트 코드로 작성을 할 것이다.
먼저 새로운 가상의 데이터를 여러개 생성하고
내가 생성한 데이터 수와 조회된 개수와 동일한지 확인할 것이고
페이징되어서 조회되는 개수도 체크 할것이다.
테스트 코드를 처음 해보는 거라서 많이 부족하지만 열심히 작성해서
오류와 품질을 최대한 높여보겠다.
EventService
// 메인페이지 조회
@Transactional(readOnly = true)
public Page<EventResponseDto> getEvents(int page) {
// ticketInfo의 isAvailable이 true인 Event를 ticketInfo의 date가 가장 빠른 순서대로 정렬하여 Page<EventResponseDto>로 반환
Pageable pageable = PageRequest.of(page, 4);
return eventRepository.findAllByAvailableOrderByticketInfoDate(pageable)
.map(EventResponseDto::new);
}
먼저 메인페이지 조회에 대한 테스트 코드를 작성하겠다.
@SpringBootTest
@Transactional
class EventServiceTest {
@Autowired
private EventRepository eventRepository;
@Autowired
private TicketInfoRepository ticketInfoRepository;
@Test
@DisplayName("메인페이지 조회")
void getEventList() {
// given (이런게 주어지고)
List<EventRequestDto> eventRequestDtoList = new ArrayList<>();
eventRequestDtoList.add(
new EventRequestDto("title1", "place1", 30000, LocalDateTime.parse("2023-04-01T00:00:00"),
LocalDateTime.parse("2023-03-01T00:00:00"), 50000));
eventRequestDtoList.add(
new EventRequestDto("title2", "place2", 30000, LocalDateTime.parse("2023-04-01T00:00:00"),
LocalDateTime.parse("2023-03-01T00:00:00"), 50000));
eventRequestDtoList.add(
new EventRequestDto("title3", "place3", 30000, LocalDateTime.parse("2023-04-01T00:00:00"),
LocalDateTime.parse("2023-03-01T00:00:00"), 50000));
eventRequestDtoList.add(
new EventRequestDto("title4", "place4", 30000, LocalDateTime.parse("2023-04-01T00:00:00"),
LocalDateTime.parse("2023-03-01T00:00:00"), 50000));
eventRequestDtoList.add(
new EventRequestDto("title5", "place5", 30000, LocalDateTime.parse("2023-04-01T00:00:00"),
LocalDateTime.parse("2023-03-01T00:00:00"), 50000));
eventRequestDtoList.add(
new EventRequestDto("title6", "place6", 30000, LocalDateTime.parse("2023-04-01T00:00:00"),
LocalDateTime.parse("2023-03-01T00:00:00"), 50000));
// when (이렇게 했을때)
for (EventRequestDto dto : eventRequestDtoList) {
Event event = eventRepository.save(new Event(dto, "image1"));
ticketInfoRepository.save(new TicketInfo(dto, event));
}
// than (이렇게 된다)
// 기본값이 예매 불가능이기 때문에 조회X 확인하려면 ticketinfo entity에 isAvailable = true 로 해야함
Pageable pageable = PageRequest.of(0, 4);
Page<Event> events = eventRepository.findAllByAvailableOrderByticketInfoDate(pageable);
assertEquals(6, events.getTotalElements());
assertEquals(4, events.getContent().size());
assertThat(events.getContent().get(0).getTitle()).isEqualTo("title1");
assertThat(events.getContent().get(0).getPlace()).isEqualTo("place1");
assertThat(events.getContent().get(0).getPrice()).isEqualTo(30000);
assertThat(events.getContent().get(0).getDate()).isEqualTo(
LocalDateTime.parse("2023-04-01T00:00:00"));
}
6개의 데이터를 저장하고 총 조회된 6개의 데이터가 맞으면 통과, 페이징이 된 조회건수가 4개이면 통과, events.getContent().get(0) 첫번째 데이터가 내가 생각한 데이터와 동일한지 판단하고 일치하면 통과
그리고 이제 상세 페이지 조회를 테스트 코드로 작성하겠다.
@Test
@DisplayName("상세페이지 조회")
void getEvent() {
// given (이런게 주어지고)
EventRequestDto eventRequestDto = new EventRequestDto("title1", "place1", 30000,
LocalDateTime.parse("2023-04-01T00:00:00"), LocalDateTime.parse("2023-03-01T00:00:00"),
50000);
// when (이렇게 했을때)
Event event = eventRepository.save(new Event(eventRequestDto, "image1"));
ticketInfoRepository.save(new TicketInfo(eventRequestDto, event));
// than (이렇게 된다)
Event getEvent = eventRepository.findById(7L).orElseThrow();
assertThat(getEvent.getId()).isEqualTo(7L);
assertThat(getEvent.getPlace()).isEqualTo("place1");
assertThat(getEvent.getPrice()).isEqualTo(30000);
assertThat(getEvent.getDate()).isEqualTo(LocalDateTime.parse("2023-04-01T00:00:00"));
assertThat(getEvent.getTicketInfo().getId()).isEqualTo(7L);
assertThat(getEvent.getTicketInfo().getOpenDate()).isEqualTo(
LocalDateTime.parse("2023-03-01T00:00:00"));
assertThat(getEvent.getTicketInfo().getLeftSeats()).isEqualTo(50000);
}
데이터 하나을 넣고 조회가 오류없이 조회가 되면 통과인데 밑에 있는 사진처럼 getId가 NULL 이 나와서 밑에 있는 코드에 setTicketInfo를 추가해서 TicketInfo 정보를 event객체에 전달해서 event객체가 현재 객체의TicketInfo정보를 참조할 수 있게 수정하였다.
@OneToOne
@JoinColumn(name = "event_id", nullable = false)
private Event event;
public TicketInfo(EventRequestDto eventRequestDto, Event event) {
this.openDate = eventRequestDto.getOpenDate();
this.totalSeats = eventRequestDto.getTotalSeat();
this.leftSeats = eventRequestDto.getTotalSeat();
this.event = event;
// 양방향 맵핑을 위해서 설정(추후 검토)
event.setTicketInfo(this);
}
----------------------------------------------------------
@OneToOne(mappedBy = "event")
private TicketInfo ticketInfo;
public Event(EventRequestDto eventRequestDto, String key) {
this.image = key;
this.title = eventRequestDto.getTitle();
this.place = eventRequestDto.getPlace();
this.price = eventRequestDto.getPrice();
this.date = eventRequestDto.getDate();
}
// 양방향 맵핑 설정(추후 검토)
public void setTicketInfo(TicketInfo ticketInfo) {
this.ticketInfo = ticketInfo;
}
'Spring' 카테고리의 다른 글
IoC/DI 의존성 주입 (0) | 2023.06.01 |
---|---|
application.yaml 로 전환하기 (0) | 2023.04.20 |
Tomcat Thread Pool (0) | 2023.04.12 |
트랜잭션 격리수준, 비관적 락 (0) | 2023.04.06 |
resources/templates/login.html (0) | 2023.04.04 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 시작 템플릿
- 오토 스케일링
- aws
- HTML
- java
- CodeDeploy
- script
- JWT
- 인스턴스
- CICD
- githubactions
- EC2
- 로드 밸런서
- 위치의 중요성
- 로드밸런서
- Load Balancer
- flask
- Auto Scaling
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함