Hibernate 抛出PersistenceException的模拟方法,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

我试图进行一个单元测试,以验证hibernate引发的异常是否会得到处理,并会导致正确的响应。异常是一个PersistenceException(),原因是ConstraintViolationException()。因此,我在ktor的StatusPages中以以下方式处理它:

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.")
    )
}
  • 当单元测试中发生错误时:
所以它不符合“it.cause is ConstraintViolationException”的条件,我不知道为什么,因为我有类似的单元测试抛出其他异常,而且它工作正常

下面是单元测试:

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
    }
}