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