質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.32%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

意見交換

クローズ

1回答

193閲覧

サービスクラスのテストにおけるモック化

Fitz

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2025/02/09 09:21

0

0

疑問

ReservationServiceのreserveメソッドを呼び出す際、「ReservationService」のオブジェクトを、モック注入用とモック化用で分けてもいいのでしょうか。

背景

ReservationServiceのreserveメソッドを呼び出すために以下のスタブを作成しました。

doReturn(reservation).when(reservationService).reserve(reservation);

テストを起動すると、「NotAMockException」が発生。
reservationServiceはモックを注入しただけでモックではないため、新たにReservationServiceクラスでモック化した「reservationServ」を用意し、修正。

doReturn(reservation).when(reservationServ).reserve(reservation);

テスト起動後、無事にテスト完了。

該当のソースコード

@ExtendWith(MockitoExtension.class) class ReservationServiceTest { //依存しているオブジェクトのモック作成 @Mock private ReservationRepository reservationRepository; @Mock private Reservation reservation; @Mock private ReservableRoomId reservableRoomId_mock; @Mock private ReservationService reservationServ; private AutoCloseable closeable; //今回テストするクラスにmockを注入 @InjectMocks private ReservationService reservationService; //モックの初期化 @BeforeEach void initService() { closeable = MockitoAnnotations.openMocks(this); } @AfterEach void closeService() throws Exception { closeable.close(); } //予約日の日付を初期化 LocalDate date = LocalDate.of(2025,01,15); //比較用のreservableRoomIdを作成 //reservableRoomIdにはroomIdとreservedDateが設定されている ReservableRoomId reservableRoomId = new ReservableRoomId(1, date); //startTime,endTime LocalTime startTime; LocalTime endTime; //reservationId Integer reservationId; //User User user; @Test @DisplayName("reserveメソッド") public void reserveTest(){ //startTime,endTime startTime = LocalTime.of(17, 00, 00); endTime = LocalTime.of(21, 00, 00); //比較用のreservableRoom 引数はreservableRoomId ReservableRoom reservableRoom = new ReservableRoom(reservableRoomId); //比較用のreservationId reservationId = 83; //Reservationに比較用の予約情報を設定 reservation.setReservationId(reservationId); reservation.setStartTime(startTime); reservation.setEndTime(endTime); reservation.setReservableRoom(reservableRoom); //モックに戻り値を設定。 doReturn(reservation).when(reservationServ) .reserve(reservation); //対象メソッドの実行 Reservation reserve = reservationServ.reserve(reservation); //値の比較 assertEquals(reservation.getReservationId(),reserve.getReservationId()); assertEquals(reservation.getStartTime(),reserve.getStartTime()); assertEquals(reservation.getEndTime(),reserve.getEndTime()); assertEquals(reservation.getReservableRoom(),reserve.getReservableRoom()); // 呼び出しの検証 verify(reservationServ, times(1)) .reserve(reservation); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答1

#1

jimbe

総合スコア13318

投稿2025/02/09 14:12

//モックに戻り値を設定。
doReturn(reservation).when(reservationServ)
.reserve(reservation);

//対象メソッドの実行
Reservation reserve = reservationServ.reserve(reservation);

ReservationService#reserve() メソッドのテストになってないのでは。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問