【问题标题】:Mock Lazy constructor parameter模拟惰性构造函数参数
【发布时间】:2018-08-24 08:18:29
【问题描述】:

这是我的第一个问题,如果我做错了什么,我深表歉意。 我正在测试一个使用注入的 Lazy Dagger 构造函数参数的用例。

import dagger.Lazy

class TrackSpeed (val analyticsRepository: Lazy<AnalyticsRepository>) {

    fun execute(timeMillis: Long) {
        analyticsRepository.get().trackSpeed(timeMillis)
    }
}

我不知道如何模拟 AnalyticsRepository,因为它是 Lazy。 这就是我的测试类现在的样子:

class TrackSpeedTest {

private lateinit var trackSpeed: TrackSpeed
private val analyticsRepository: Lazy<AnalyticsRepository> = mock()

@Before
fun setUp() {
    trackSpeed = TrackSpeed(analyticsRepository)
}

@Test
fun testTrackSpeed() {
    val time: Long = 0

    trackSpeed.execute(time)

    verify(analyticsRepository.get(), times(1))
        .trackSpeed(time)
}

没有编译错误,但是当我运行测试时它失败并出现以下异常:

java.lang.ClassCastException: io.reactivex.internal.operators.flowable.FlowableError 无法在 com.package.TrackSpeed.execute() 中转换为 com.package.AnalyticsRepository

有什么建议吗? 提前致谢。

【问题讨论】:

    标签: android unit-testing kotlin mockito lazy-evaluation


    【解决方案1】:

    您可以创建一个实际的 Lazy 实例,该实例在 get() 中返回您模拟的 AnalyticsRepository:

    analyticsRepository = mock<AnalyticsRepository>()
    val lazy = Lazy<AnalyticsRepository> { analyticsRepository }
    trackSpeed = TrackSpeed(lazy)
    

    【讨论】:

    • 有没有办法利用 Mockito 注释?例如使用@InjectMock 可以节省一些样板文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2010-09-21
    • 1970-01-01
    • 2019-11-24
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多