模拟懒惰的构造函数参数

时间:2018-08-24 08:18:30

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

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

import dagger.Lazy

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

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

我不知道如何模拟AnalyticsRepository,因为它很懒。 这是我的测试班级现在的样子:

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

有什么建议吗? 预先感谢。

1 个答案:

答案 0 :(得分:1)

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

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