我无法在Kotlin-test 3.4.2中使用Koin 2.0.1。我得到的InvocationTargetException是这样的:
Running koinexample.KoinSampleTests
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.009 sec <<< FAILURE! - in koinexample.KoinSampleTests
koinexample.KoinSampleTests Time elapsed: 0.009 sec <<< ERROR!
java.lang.reflect.InvocationTargetException
at koinexample.KoinSampleTests.getKoin(KoinSampleTests.kt:26)
at koinexample.KoinSampleTests.<init>(KoinSampleTests.kt:61)我在GitHub上创建了一个重现此错误的小示例:https://github.com/elifarley/kotlin-tests-with-koin-examples
只需执行以下命令即可克隆存储库并运行测试:
git clone https://github.com/elifarley/kotlin-tests-with-koin-examples.git
cd kotlin-tests-with-koin-examples
mvn下面是主要的Kotlin文件:
package koinexample
import io.kotlintest.koin.KoinListener
import io.kotlintest.shouldBe
import io.kotlintest.specs.FreeSpec
import org.koin.core.inject
import org.koin.dsl.module
import org.koin.test.KoinTest
data class Stats(var ok: Long = 0, var error: Long = 0)
interface StatsServer {
fun newError(): Long
}
class StatsServerSimple(private val stats: Stats) : StatsServer {
override fun newError() = stats.error++
}
val appModule = module {
single { Stats() }
single { StatsServerSimple(get()) as StatsServer }
}
class KoinSampleTests : FreeSpec(), KoinTest {
private val modules = listOf(
appModule
)
override fun listeners() = listOf(KoinListener(modules))
val statsServer: StatsServer by inject()
init {
"Happy path" {
statsServer.newError() shouldBe 1
}
}
}发布于 2020-03-06 01:57:08
您的问题似乎是一个简单的导入混淆。
注意,您使用的是import org.koin.core.inject,它是这个函数:
inline fun <reified T> KoinComponent.inject(
qualifier: Qualifier? = null,
noinline parameters: ParametersDefinition? = null
): Lazy<T> =
getKoin().inject(qualifier, parameters)它需要getKoin才能工作,因此您无法初始化测试(测试类在Koin有机会启动侦听器之前就已初始化)。
正确的导入是import org.koin.test.inject,其转换为:
inline fun <reified T> KoinTest.inject(
qualifier: Qualifier? = null,
noinline parameters: ParametersDefinition? = null
): Lazy<T> = lazy { get<T>(qualifier, parameters) }请注意,这确实是惰性的,因此Kotest将有机会在测试开始之前初始化Koin。
修复该导入应该可以解决此问题
发布于 2020-03-03 21:38:18
看起来你永远不会启动Koin应用程序。你需要有
startKoin {
modules(appModule)
}在您的测试方法中或在规范的beforeSpec/beforeTest函数调用中。
或者使用下面这样的代码:
override fun listeners() = listOf(KoinListener(appModule))这在kotlintest/kotest的文档中有描述:https://github.com/Kotest/Kotest/blob/master/doc/extensions.md#koin
https://stackoverflow.com/questions/60079334
复制相似问题