我在测试 ktor 时遇到问题。基本上,ApplicationTest 类不会注入存储库类,它显示 java..ClassCastExce 错误

Pra*_*hta 5 android kotlin okhttp ktor koin

这是我的应用程序测试类

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()
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

当 HeroRepository 进行注入并且我使用 koin 进行依赖注入时,它显示 java.lang.ClassCastException 的错误

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')
Run Code Online (Sandbox Code Playgroud)

这是我的 AllHeroesRoute,这里完美地注入了 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
            )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ayu*_*n12 7

我遇到了同样的问题,禁用developmentMode 修复了它:

fun myTestFunc() = testApplication {
    environment {
        developmentMode = false
    }
    ....
}
    
Run Code Online (Sandbox Code Playgroud)