我有一个集成测试,需要在运行任何后续测试之前调用一次REST服务以获取访问令牌。在将Koin添加到我的项目之前,我是通过用@BeforeClass
注释的静态方法来完成此操作的,如下所示:
class PersonRepositoryIntegrationTest {
companion object {
private var _clientToken: String? = null
@BeforeClass
@JvmStatic
fun setup() {
_clientToken = AuthRepository().getClientToken()!!.accessToken
}
}
@Test
fun testCreatePerson() {
PersonRepository().createPerson(_clientToken)
}
AuthRepository和PersonRepository还具有其他依赖关系,到目前为止,它们都已在其构造函数中实例化。现在,我想使用Koin通过注入存储库来解决这些依赖关系:
class PersonRepositoryIntegrationTest : KoinTest {
companion object {
private val _authRepository by inject<IAuthRepository>()
private val _personRepository by inject<IPersonRepository>()
private var _clientToken: String? = null
@BeforeClass
@JvmStatic
fun beforeClass() {
startKoin(listOf(AppModule.appModule))
_clientToken = _authRepository.getClientToken()!!.accessToken
}
}
当我尝试在同伴对象内使用inject
时,编译器会给出错误消息:
Unresolved reference.
None of the following candidates is applicable because of receiver type mismatch.
* public inline fun <reified T : Any> KoinComponent.inject(name: String = ..., scope: Scope? = ..., noinline parameters: ParameterDefinition = ...): Lazy<IAuthRepository> defined in org.koin.standalone
还有另一种方法可以使用Koin将我的类注入这样的@BeforeClass
静态方法中吗?
答案 0 :(得分:3)
根据kotlin documentation,伴随对象在技术上是真实的对象。
即使伴随对象的成员看起来像静态成员 在其他语言中,在运行时,它们仍然是 真实对象,并可以实现接口:
如果一个类想注入依赖项,但它不是koin支持的类之一(Activity,Fragment,ViewModel,KoinTest等),则该类应实现KoinComponent接口。
因此请考虑将伴随对象定义更改为以下内容,然后重试。
companion object : KoinComponent{
private val _authRepository by inject<IAuthRepository>()
private val _personRepository by inject<IPersonRepository>()
private var _clientToken: String? = null
@BeforeClass
@JvmStatic
fun beforeClass() {
startKoin(listOf(AppModule.appModule))
_clientToken = _authRepository.getClientToken()!!.accessToken
}
答案 1 :(得分:0)
除了接受的答案之外,我发现我可以使用org.koin.java.standalone.KoinJavaComponent中的inject
方法,该文档记录在here中:
import org.koin.java.standalone.KoinJavaComponent.inject
class PersonRepositoryIntegrationTest : KoinTest {
companion object {
private val _authRepository by inject(IAuthRepository::class.java)
private val _personRepository by inject(IPersonRepository::class.java)
private var _clientToken: String? = null
@BeforeClass
@JvmStatic
fun beforeClass() {
startKoin(listOf(AppModule.appModule))
_clientToken = _authRepository.getClientToken()!!.accessToken
}
}
这对我来说似乎很奇怪,因为我在Kotlin类中使用Java互操作方法,因此我更愿意通过更改伴随对象来扩展KoinComponent来代替here来解决问题。