测试KTOR时,我有问题。基本上Application -Test类未注入存储库类,它显示了Java的错误.. ClassCastExce

发布于 2025-02-04 04:31:34 字数 2155 浏览 4 评论 0原文

这是我的应用程序测试课程,

class ApplicationTest {
    private val heroRepository: HeroRepository by inject(HeroRepository::class.java)

    @OptIn(InternalAPI::class)
    @Test
    fun `access all heroes endpoints, assert correct information`() = testApplication {

        val response = client.get("/naruto/heroes")
        assertEquals(
            expected =
            """
                    {
                    success = true,
                    message = "ok",
                    prevPage = null,
                    nextPage = 2,
                    heroes = ${heroRepository.heroes[1]!!}
                    }
                """.trimIndent()  ,
            actual = response.bodyAsText()
        )
    }
}

它显示了java.lang.classcastException的错误时,当HerorePository被注入时,我正在使用Koin进行依赖注入

java.lang.ClassCastException: class com.example.repository.HeroRepositoryImpl cannot be cast to class com.example.repository.HeroRepository (com.example.repository.HeroRepositoryImpl is in unnamed module of loader io.ktor.server.engine.OverridingClassLoader$ChildURLClassLoader @7f6ad6c8; com.example.repository.HeroRepository is in unnamed module of loader 'app')

,这是我的AllheroeSroute

fun Route.getAllHeroes() {

    val heroRepository: HeroRepository by inject()

    get("/naruto/heroes") {
        try {
            val page = call.request.queryParameters["page"]?.toInt() ?: 1
            require(page in 1..5)
            val apiResponse = heroRepository.getAllHeroes(page = page)
            call.respond(
                message = apiResponse,
                status = HttpStatusCode.OK
            )
        } catch (e: NumberFormatException) {
            call.respond(
                message = ApiResponse(success = false, message = "Only numbers allowed"),
                status = HttpStatusCode.BadRequest
            )
        } catch (e: IllegalArgumentException) {
            call.respond(
                message = ApiResponse(success = false, message = "Heroes Not Found"),
                status = HttpStatusCode.BadRequest
            )
        }
    }
}

This is my application test class

class ApplicationTest {
    private val heroRepository: HeroRepository by inject(HeroRepository::class.java)

    @OptIn(InternalAPI::class)
    @Test
    fun `access all heroes endpoints, assert correct information`() = testApplication {

        val response = client.get("/naruto/heroes")
        assertEquals(
            expected =
            """
                    {
                    success = true,
                    message = "ok",
                    prevPage = null,
                    nextPage = 2,
                    heroes = ${heroRepository.heroes[1]!!}
                    }
                """.trimIndent()  ,
            actual = response.bodyAsText()
        )
    }
}

It show the error of java.lang.ClassCastException when heroRepository is getting inject and i am using koin for dependency injection

java.lang.ClassCastException: class com.example.repository.HeroRepositoryImpl cannot be cast to class com.example.repository.HeroRepository (com.example.repository.HeroRepositoryImpl is in unnamed module of loader io.ktor.server.engine.OverridingClassLoader$ChildURLClassLoader @7f6ad6c8; com.example.repository.HeroRepository is in unnamed module of loader 'app')

And this is my AllHeroesRoute and here it's perfectly injecting heroRepository

fun Route.getAllHeroes() {

    val heroRepository: HeroRepository by inject()

    get("/naruto/heroes") {
        try {
            val page = call.request.queryParameters["page"]?.toInt() ?: 1
            require(page in 1..5)
            val apiResponse = heroRepository.getAllHeroes(page = page)
            call.respond(
                message = apiResponse,
                status = HttpStatusCode.OK
            )
        } catch (e: NumberFormatException) {
            call.respond(
                message = ApiResponse(success = false, message = "Only numbers allowed"),
                status = HttpStatusCode.BadRequest
            )
        } catch (e: IllegalArgumentException) {
            call.respond(
                message = ApiResponse(success = false, message = "Heroes Not Found"),
                status = HttpStatusCode.BadRequest
            )
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

戏舞 2025-02-11 04:31:34

我遇到了同样的问题,禁用了开发模式修复了它:

fun myTestFunc() = testApplication {
    environment {
        developmentMode = false
    }
    ....
}
    

I had the same issue, disabling the developmentMode fixed it:

fun myTestFunc() = testApplication {
    environment {
        developmentMode = false
    }
    ....
}
    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文