0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Spring Bootでのエラーハンドリング--@RestControllerAdviceのテスト方法--

Posted at

はじめに

Spring BootのRestControllerAdviceを利用して、アプリケーション全体でエラーハンドリングを一元化することができます。
参考
この実装に対してのテストが書きたくなったので
RestControllerAdviceのテスト方法について詳しく説明します。

RestControllerAdviceの設定

まず、RestControllerAdviceの基本的な設定を確認します。以下は、簡単な例です。

@RestControllerAdvice
class GlobalExceptionHandler {

    @ExceptionHandler(value = [CustomException::class])
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    fun handleCustomException(ex: CustomException): ErrorResponse {
        return ErrorResponse("Custom error occurred", ex.message)
    }
}

data class CustomException(val message: String) : RuntimeException(message)

data class ErrorResponse(val error: String, val message: String?)

この例では、CustomExceptionがスローされたときにHttpStatus.BAD_REQUESTでエラーレスポンスを返します。

テスト用のエンドポイントの作成

次に、RestControllerAdviceをテストするためのエンドポイントを作成します。

@Profile("test")
@RestController
class TestController {
    @GetMapping("/test")
    fun testEndpoint() {
        throw CustomException("Test error")
    }
}

このコントローラでは、/testエンドポイントにアクセスするとCustomExceptionがスローされます。

テストの作成

次に、RestControllerAdviceのテストを作成します。テストにはMockMvcとmockkを使用します。

エラーハンドリング確認用コントローラーのテスト
import io.mockk.every
import io.mockk.mockk
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.test.context.junit.jupiter.SpringExtension
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status

@ExtendWith(SpringExtension::class)
@WebMvcTest(controllers = [TestController::class, GlobalExceptionHandler::class])
class GlobalExceptionHandlerTest {

    @Autowired
    private lateinit var mockMvc: MockMvc

    @Test
    fun `should return BAD_REQUEST for CustomException`() {
        mockMvc.perform(get("/test"))
            .andExpect(status().isBadRequest)
            .andExpect(jsonPath("$.error").value("Custom error occurred"))
            .andExpect(jsonPath("$.message").value("Test error"))
    }
}

上記のテストコードでは、MockMvcを使用して/testエンドポイントを呼び出し、CustomExceptionがスローされたときのレスポンスを検証しています。このテストを実行することで、RestControllerAdviceが正しく動作していることを確認できます。
またTestControllerClassに

@Profile("test")

を付与することでテスト時のみに読み込まれるAPIになるので本番環境で公開されないので安心です。

まとめ

Spring BootのRestControllerAdviceを使用することで、エラーハンドリングを簡単に一元化できます。この記事では、その設定方法とテスト方法について説明しました。正しいテストを行うことで、アプリケーションの信頼性を向上させることができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0