【问题标题】:Kotlin lazy block not executed when using Mockito and InjectMocks [closed]使用 Mockito 和 InjectMocks 时未执行 Kotlin 延迟块 [关闭]
【发布时间】:2016-04-05 15:08:43
【问题描述】:

我正在使用 Mockito 测试我的 Kotlin 代码。这是一个网络应用程序,我使用 spring 将值注入某些字段。

例如,我的类 sn-p 看起来像这样:

class MyComponent {

    @Inject private lateinit var request: HttpServletRequest
    @Inject private lateinit var database: Database

为了在我的单元测试中模仿这一点,我使用了来自 Mockito 的 @Mock@InjectMocks 注释。所以我的测试看起来像这样:

class MyComponentTest {

    @Mock private lateinit var request: HttpServletRequest
    @Mock private lateinit var database: Database

    @InjectMocks private lateinit var sut: MyComponent

    @Before
    fun setup() {
       MockitoAnnotations.initMocks(this)
    }

一切正常。但是,我的组件中也有一个惰性初始化块,如下所示:

val user: User by lazy {
    database.findUser()
}

fun getUsername(): String {
    return user.name
}

当我的测试调用myComponent.getUsername() 时,我希望database.findUser() 在初始化user 时被调用,但这不会发生。

如果我在惰性块中设置断点,它永远不会被命中。现在我假设这与 Mockito 和 @InjectMocks 必须“触摸”user 的方式有关,但我真的不知道。如果我手动构造MyComponent,则会执行惰性块 - 但这不会注入我的模拟。

如何确保从我的测试中正确调用惰性块?

更新:缺席一周后,尝试在没有任何更改的情况下重现此内容,但我做不到。无法解释。

【问题讨论】:

  • 如果您能提供一个MCVE 会有所帮助。就像现在一样,我无法复制您的代码并重现您看到的问题。

标签: mockito kotlin


【解决方案1】:

我已尝试重现您的问题,但无法重现。这个gist 提供了一个工作示例。

但是,我建议重新审视您编写测试的方式。考虑以下示例:

class MyComponentTest {

    val request = mock<HttpServletRequest>()
    val database = mock<Database>()
    val sut = MyComponent(request, database)

    @Test
    fun username() {
        Mockito.`when`(database.findUser()).thenReturn(User("test"))

        val username = sut.getUsername()

        MatcherAssert.assertThat(username, Matchers.equalTo("test"))
    }
}

在我看来,这比the gist 中提到的更容易理解。

如果您有兴趣,mock 辅助函数是一个单行:

inline fun <reified T : Any> mock() = Mockito.mock(T::class.java)

可以在gist 中找到完整更新的示例。

【讨论】:

  • 感谢使用构造函数注入的建议,我喜欢这个,因为这意味着我可以摆脱我的延迟初始化并使用 vals 而不是 vars。至于最初的问题,我将用 MCVE 更新我的问题,虽然很奇怪,因为您的要点几乎完全一样。
  • 好的,我在一周假期后回到这个问题,并试图重现我的问题,但没有运气。发生了一些非常奇怪的事情,但是我没有更改的原始代码现在可以工作了。感谢您的努力!
  • 我想提一下,答案中提到的要点已经更改为 lateinits 注释样式,在我看来,它更清晰。
猜你喜欢
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2012-03-17
  • 2023-01-18
相关资源
最近更新 更多