実現したいこと
テストで実現したいこと:以下概要の処理で①検索メソッドがきちんと機能すること、➁重複チェック処理で所定のメッセージが表示されること
概要:ReservationService内で、予約情報をもとに会議の開始時間と終了時間が被らないようにするため、anyMatchメソッドを用いて重複チェックを行う処理を記述した。この処理でtrueだった場合、UnavailableReservationExceptionメソッドでメッセージを表示させるようにした。
発生している問題・分からないこと
重複チェックをテストにどのように落とし込むかが分かりません。
検索メソッドがきちんと機能するかについては基本的なメソッドのテストで実現できると思っています。
該当のソースコード
ReservationService
1@Service 2@Transactional 3public class ReservationService { 4 5 @Autowired 6 ReservationRepository reservationRepository; 7 8 @Autowired 9 ReservableRoomRepository reservableRoomRepository; 10 11 //指定の会議室の予約一覧を取得 12 public List<Reservation> findReservations(ReservableRoomId reservableRoomId){ 13 14 return reservationRepository.findByReservableRoom_ReservableRoomIdOrderByStartTimeAsc(reservableRoomId); 15 } 16 17 //予約機能 18 public Reservation reserve(Reservation reservation) { 19 20 ReservableRoomId reservableRoomId = reservation.getReservableRoom().getReservableRoomId(); 21 22 //追記:開始時刻を取得 23 LocalTime startTime =reservation.getStartTime(); 24 25 //追記:終了時刻を取得 26 LocalTime endTime =reservation.getEndTime(); 27 28 LocalDate reservedDate = reservableRoomId.getReservedDate(); 29 30 //追記重複チェック 31 //指定された部屋で検索 32 List<Reservation> reservationlist = findReservations(reservableRoomId); 33 boolean resultTrue = reservationlist.stream() 34 .anyMatch(reservate -> 35 (reservate.getStartTime().isBefore(endTime) && reservate.getEndTime().isAfter(startTime)) 36 || (reservate.getStartTime().equals(startTime) || reservate.getEndTime().equals(endTime)) 37 ); 38 39 40 //悲観ロックできるようにしたメソッドを呼び出す 41 ReservableRoom reservable = reservableRoomRepository.findOneForUpdateByReservableRoomId(reservableRoomId); 42 43 if(reservable == null) { 44 throw new UnavailableReservationException("入力の日付、部屋の組み合わせは予約できません。"); 45 } 46 //追記箇所 47 if(reservedDate.isBefore(LocalDate.now()) || reservedDate.equals(LocalDate.now())) { 48 if(startTime.isBefore(LocalTime.now())) { 49 throw new UnavailableReservationException("その時間は予約できません。"); 50 } 51 } 52 53 //追記箇所検索した内容で審議値がtrueになるとメッセージ表示 54 if (resultTrue == true) { 55 throw new UnavailableReservationException("入力の時間帯はすでに予約済みです。"); 56 } 57 58 59 //予約情報登録 60 reservationRepository.save(reservation); 61 return reservation; 62 }
ReservationServiceTest
1@ExtendWith(MockitoExtension.class) 2class ReservationServiceTest { 3 4 5 //依存しているオブジェクトのモック作成 6 7 @Mock 8 private ReservationRepository reservationRepository; 9 @Mock 10 private ReservableRoomRepository reservableRoomRepository; 11 @Mock 12 private Reservation reservation; 13 @Mock 14 private ReservableRoomId reservableRoomId_mock; 15 16 private AutoCloseable closeable; 17 18 //今回テストするクラスにmockを注入 19 @InjectMocks 20 private ReservationService reservationService; 21 22 //モックの初期化 23 @BeforeEach 24 void initService() { 25 closeable = MockitoAnnotations.openMocks(this); 26 } 27 28 @AfterEach 29 void closeService() throws Exception { 30 closeable.close(); 31 } 32 @Test 33 @DisplayName("予約情報取得") 34 public void testFindReservations() { 35 36 //予約日の日付を初期化 37 LocalDate date = LocalDate.of(2025,01,15); 38 //比較用のreservableRoomIdを作成 39 //reservableRoomIdにはroomIdとreservedDateが設定されている 40 ReservableRoomId reservableRoomId = new ReservableRoomId(1, date); 41 42 //比較用のstartTime,endTime 43 LocalTime startTime = LocalTime.of(17, 00, 00); 44 LocalTime endTime = LocalTime.of(21, 00, 00); 45 46 //比較用のreservableRoom 引数はreservableRoomId 47 ReservableRoom reservableRoom = new ReservableRoom(reservableRoomId); 48 49 //比較用のreservationId 50 Integer reservationId = 83; 51 52 //Reservationに比較用の予約情報を設定 53 reservation = new Reservation(); 54 reservation.setReservationId(reservationId); 55 reservation.setStartTime(startTime); 56 reservation.setEndTime(endTime); 57 reservation.setReservableRoom(reservableRoom); 58 59 //モックに戻り値を設定。 60 doReturn(Optional.of(reservation)).when(reservationRepository) 61 .findByReservableRoom_ReservableRoomIdOrderByStartTimeAsc(reservableRoomId); 62 63 Reservation reservation_Test = (Reservation) reservationRepository 64 .findByReservableRoom_ReservableRoomIdOrderByStartTimeAsc(reservableRoomId); 65 66 //値の比較 67 assertEquals(reservation.getReservationId(),reservation_Test.getReservationId()); 68 assertEquals(reservation.getStartTime(),reservation_Test.getStartTime()); 69 assertEquals(reservation.getEndTime(),reservation_Test.getEndTime()); 70 assertEquals(reservation.getReservableRoom(),reservation_Test.getReservableRoom()); 71 72 // 呼び出しの検証 73 verify(reservationRepository, times(1)) 74 .findByReservableRoom_ReservableRoomIdOrderByStartTimeAsc(reservableRoomId); 75 }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
if文の検証は見当たりませんでした。
補足
特になし
