采用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不能嵌套
解决方案- 避免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
}
}
- 对installKoin做异常保护
installKoin {
modules(dbModule)
}
修改为
try {
installKoin {
modules(dbModule)
modules(serviceModule)
}
} catch (e: Exception) {}
安卓开发技术分享: https://blog.csdn.net/yinxing2008/article/details/84555061 点击关注专栏,查看最新技术分享 更多技术总结好文,请关注:「程序园中猿」