【发布时间】: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 会有所帮助。就像现在一样,我无法复制您的代码并重现您看到的问题。