【问题标题】:How to inject a list of implementations in a @InjectMockKs test instance?如何在@InjectMockKs 测试实例中注入实现列表?
【发布时间】:2020-01-02 16:00:18
【问题描述】:

Spring Boot 允许将接口 (SomeComponent) 的所有实现列表作为 List 注入到另一个组件 (SomeOtherComponent) 中,例如

@Component
interface SomeComponent
@Component
class SomeComponentImpl0 : SomeComponent
@Component
class SomeComponentImpl1 : SomeComponent
class SomeOtherComponent {
    @Autowired
    lateinit var impls: List<SomeComponent>
}

如何使用 MockK 注释为实现注入模拟?在

import io.mockk.MockKAnnotations
import io.mockk.impl.annotations.InjectMockKs
import io.mockk.impl.annotations.MockK
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test

class SomeOtherComponentTest {
    @MockK
    lateinit var someComponentImpl0: SomeComponentImpl0

    @MockK
    lateinit var someComponentImpl1: SomeComponentImpl1

    @InjectMockKs
    lateinit var instance: SomeOtherComponent

    @BeforeEach
    fun setup() {
        MockKAnnotations.init(this)
    }

    @Test
    fun testSomething() {
        println(instance.impls.toString())
    }
}

我也得到了

io.mockk.MockKException: 
No matching constructors found:
constructor(impls : kotlin.collections.List<de.richtercloud.inject.mocks.foor.list.of.impl.SomeComponent> = <not able to lookup>)
        at de.richtercloud.inject.mocks.foor.list.of.impl.SomeOtherComponentTest.setup(SomeOtherComponentTest.kt:40)

如果我使用构造函数注入和

kotlin.UninitializedPropertyAccessException: lateinit property impls has not been initialized
        at de.richtercloud.inject.mocks.foor.list.of.impl.SomeOtherComponentTest.testSomething(SomeOtherComponentTest.kt:26)

如果我在类中使用@Autowired var 属性。

我正在使用 1.3.50 到 Maven 3.6 和 MockK 1.9.3。

【问题讨论】:

    标签: spring spring-boot kotlin dependency-injection mockk


    【解决方案1】:

    在您的测试类上方添加@ExtendWith(MockKExtension::class) 以使@InjectMokKs 工作。

    【讨论】:

      【解决方案2】:

      我在这里遇到了同样的问题。当我从正在测试的组件中删除 lateinit 并在声明时实例化它时,它起作用了。

      例如,改变了:

          @InjectMockKs
          lateinit var instance: SomeOtherComponent
      

      到:

          @InjectMockKs
          var instance = SomeOtherComponent()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-06
        • 1970-01-01
        • 2016-11-29
        相关资源
        最近更新 更多