您当前的位置: 首页 >  ar

蓝不蓝编程

暂无认证

  • 2浏览

    0关注

    706博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ktor单元测试报错:org.koin.core.error.KoinAppAlreadyStartedException: A Koin Application has already been

蓝不蓝编程 发布时间:2019-05-07 14:21:34 ,浏览量:2

背景介绍

采用ktor、koin的服务端程序,在执行单元测试时报错. 为了进行登陆后的操作,需要先登陆获取token,再去调用其他的接口.

代码
class NoteTest {
    @Test
    fun testAddNote() {
        withTestApplication({ module(testing = true) }) {
            val token = loginToGetToken()
            handleRequest(HttpMethod.Post, "/note/add")
            {
                addHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString())
                addHeader("Authorization", "Bearer $token")
                setBody(
                    mapOf(
                        "title" to "title2",
                        "content" to "content2"
                    ).json
                )
            }.apply {

                val result = ObjectMapper().readValue(response.content!!)
                assertEquals(0, result.code)
            }
        }
    }

    @Test
    fun loginToGetToken(): String? {
        var token: String? = null
        withTestApplication({ module(testing = true) }) {
            handleRequest(HttpMethod.Post, "/user/login")
            {
                addHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString())
                setBody(
                    mapOf(
                        "loginId" to loginId,
                        "password" to password
                    ).json
                )
            }.apply {

                val result = ObjectMapper().readValue(response.content!!)
                token = result.data?.token
            }
        }
        return token
    }
}
报错信息

org.koin.core.error.KoinAppAlreadyStartedException: A Koin Application has already been started at org.koin.core.context.GlobalContext.start(GlobalContext.kt:51) at org.koin.core.context.GlobalContextKt.startKoin(GlobalContext.kt:83) at org.koin.ktor.ext.KtorApplicationExtKt.installKoin(KtorApplicationExt.kt:49)

原因

withTestApplication不能嵌套

解决方案
  1. 避免withTestApplication嵌套
class NoteTest {
    @Test
    fun testAddNote() {
        withTestApplication({ module(testing = true) }) {
            val token = loginToGetToken()
            handleRequest(HttpMethod.Post, "/note/add")
            {
                addHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString())
                addHeader("Authorization", "Bearer $token")
                setBody(
                    mapOf(
                        "title" to "title2",
                        "content" to "content2"
                    ).json
                )
            }.apply {

                val result = ObjectMapper().readValue(response.content!!)
                System.out.println(result.data?.noteId)
                assertEquals(0, result.code)
            }
        }
    }

    private fun TestApplicationEngine.loginToGetToken(): String? {
        var token: String?
        handleRequest(HttpMethod.Post, "/user/login")
        {
            addHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString())
            setBody(
                mapOf(
                    "loginId" to loginId,
                    "password" to password
                ).json
            )
        }.apply {
            val result = ObjectMapper().readValue(response.content!!)
            token = result.data?.token
        }
        return token
    }
}
  1. 对installKoin做异常保护
installKoin {
    modules(dbModule)
}

修改为

try {
    installKoin {
        modules(dbModule)
        modules(serviceModule)
    }
} catch (e: Exception) {}

安卓开发技术分享: https://blog.csdn.net/yinxing2008/article/details/84555061 点击关注专栏,查看最新技术分享 更多技术总结好文,请关注:「程序园中猿」

关注
打赏
1639405877
查看更多评论
立即登录/注册

微信扫码登录

0.0406s