gpt4 book ai didi

mockito - 使用 Mockito 和 InjectMocks 时未执行 Kotlin 惰性 block

转载 作者:行者123 更新时间:2023-12-04 20:35:39 24 4
gpt4 key购买 nike

关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

6年前关闭。




Improve this question




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

例如,我的类片段看起来像这样:

class MyComponent {

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

为了在我的单元测试中模仿这一点,我使用了 @Mock@InjectMocks来自 Mockito 的注释。所以我的测试看起来像这样:
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)
}

这一切都很好。但是,我的组件中也有一个惰性初始化 block ,如下所示:
val user: User by lazy {
database.findUser()
}

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

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

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

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

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

最佳答案

我试图重现您的问题,但无法重现。这个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 中找到。 .

关于mockito - 使用 Mockito 和 InjectMocks 时未执行 Kotlin 惰性 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36430229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com