Hibernate 抛出PersistenceException的模拟方法,StatusPages接收到不同的异常
我试图进行一个单元测试,以验证hibernate引发的异常是否会得到处理,并会导致正确的响应。异常是一个PersistenceException(),原因是ConstraintViolationException()。因此,我在ktor的StatusPages中以以下方式处理它:Hibernate 抛出PersistenceException的模拟方法,StatusPages接收到不同的异常,hibernate,unit-testing,ktor,koin,mockk,Hibernate,Unit Testing,Ktor,Koin,Mockk,我试图进行一个单元测试,以验证hibernate引发的异常是否会得到处理,并会导致正确的响应。异常是一个PersistenceException(),原因是ConstraintViolationException()。因此,我在ktor的StatusPages中以以下方式处理它: exception<PersistenceException> { if (it.cause is DataException) call.respond( HttpStatusCo
exception<PersistenceException> {
if (it.cause is DataException) call.respond(
HttpStatusCode.BadRequest,
AppError("Cannot fulfill request due to Invalid Data.")
)
else if (it.cause is ConstraintViolationException) call.respond(
HttpStatusCode.ExpectationFailed,
AppError("Cannot fulfill request due to Constraint Violations.")
)
}
- 当单元测试中发生错误时:
fun `POST request handles constraint issue with inserting in the database`() {
(...)
val subscriptionsRepository = get(SubscriptionsRepository::class.java)
every {
subscriptionsRepository.addSubscriptionRequest(any())
} throws PersistenceException(
"Constraint Exception",
ConstraintViolationException("Ex", PSQLException("Ex", PSQLState.UNIQUE_VIOLATION), "Ex")
)
(...)
val fakeRequest = SubscriptionRequestDTO(...)
withTestApplication(Application::main) {
val request = handleRequest {
method = HttpMethod.Post
addHeader("content-type", "application/json")
uri = "subscriptions/requests"
setBody(Gson().toJson(fakeRequest))
addJwtHeader(makeToken(validAlgorithm, isExpired = false))
}
request.response.status() shouldBe HttpStatusCode.ExpectationFailed // fails saying that the status is null
}
}
javax.persistence.PersistenceException: Ex
(Coroutine boundary)
at io.ktor.features.ContentNegotiation$Feature$install$1.invokeSuspend(ContentNegotiation.kt:107)
at io.ktor.features.StatusPages$interceptCall$2.invokeSuspend(StatusPages.kt:101)
at io.ktor.features.StatusPages.interceptCall(StatusPages.kt:100)
at io.ktor.features.StatusPages$Feature$install$2.invokeSuspend(StatusPages.kt:140)
at io.ktor.features.CallLogging$Feature$install$2.invokeSuspend(CallLogging.kt:139)
at io.ktor.server.testing.TestApplicationEngine$callInterceptor$1.invokeSuspend(TestApplicationEngine.kt:291)
at io.ktor.server.testing.TestApplicationEngine$2.invokeSuspend(TestApplicationEngine.kt:50)
Caused by: javax.persistence.PersistenceException: Ex
... 8 more
Caused by: javax.persistence.PersistenceException: Ex
(Coroutine boundary)
at io.ktor.routing.Routing.executeResult(Routing.kt:147)
at io.ktor.routing.Routing.interceptor(Routing.kt:34)
at io.ktor.routing.Routing$Feature$install$1.invokeSuspend(Routing.kt:99)
at io.ktor.features.ContentNegotiation$Feature$install$1.invokeSuspend(ContentNegotiation.kt:107)
at io.ktor.features.StatusPages$interceptCall$2.invokeSuspend(StatusPages.kt:101)
at io.ktor.features.StatusPages.interceptCall(StatusPages.kt:100)
at io.ktor.features.StatusPages$Feature$install$2.invokeSuspend(StatusPages.kt:140)
at io.ktor.features.CallLogging$Feature$install$2.invokeSuspend(CallLogging.kt:139)
at io.ktor.server.testing.TestApplicationEngine$callInterceptor$1.invokeSuspend(TestApplicationEngine.kt:291)
at io.ktor.server.testing.TestApplicationEngine$2.invokeSuspend(TestApplicationEngine.kt:50)
at io.ktor.server.testing.TestApplicationEngine$handleRequest$pipelineJob$1.invokeSuspend(TestApplicationEngine.kt:290)
Caused by: org.hibernate.exception.ConstraintViolationException: Ex
at com.controller.SubscriptionRequestControllerTest.POST request handles constraint issue with inserting in the database(SubscriptionRequestControllerTest.kt:298)
(...)
Caused by: org.postgresql.util.PSQLException: Ex
(...)
fun `POST request handles constraint issue with inserting in the database`() {
(...)
val subscriptionsRepository = get(SubscriptionsRepository::class.java)
every {
subscriptionsRepository.addSubscriptionRequest(any())
} throws PersistenceException(
"Constraint Exception",
ConstraintViolationException("Ex", PSQLException("Ex", PSQLState.UNIQUE_VIOLATION), "Ex")
)
(...)
val fakeRequest = SubscriptionRequestDTO(...)
withTestApplication(Application::main) {
val request = handleRequest {
method = HttpMethod.Post
addHeader("content-type", "application/json")
uri = "subscriptions/requests"
setBody(Gson().toJson(fakeRequest))
addJwtHeader(makeToken(validAlgorithm, isExpired = false))
}
request.response.status() shouldBe HttpStatusCode.ExpectationFailed // fails saying that the status is null
}
}