如何使用Koin注入@BeforeClass静态方法?

问题描述 投票:2回答:2

我有一个集成测试需要在运行任何后续测试之前调用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静态方法中注入我的类吗?

junit kotlin dependency-injection static koin
2个回答
4
投票

根据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
        }

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来解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.