具有默认非常量参数的测试函数



我有一个适用于时间的方法,因此我需要将当前时间作为参数传递给它,以使其可测试:

fun dummy(now: Instant = Instant()) = true

但是,我不能用Mockito来模拟它,我认为是因为在代码中调用它没有默认参数。classA.dummy()总是返回false。我不能使用dummy(any())因为Mockito抱怨它是空的。如何测试这种功能?

@Test
fun test() {
whenever(classA.dummy()).thenReturn(true)
classUnderTest.execute()
verify(classB).execute()
}
class ClassUnderTest {
@Inject lateinit var classA: ClassA
@Inject lateinit var classB: ClassB
fun execute() {
if (classA.dummy()) classB.execute()
}
}

因为默认参数是瞬间,所以在whenever是瞬间 1,但执行时是瞬间 2,它可能是毫秒的差异,也可能是引用不同; 参数不匹配。你必须通过这一刻来execute

val instant = Instant()
whenever(classA.dummy(instant)).thenReturn(true)
classUnderTest.execute(instant)
//...

和被测班级

fun execute(instant: Intant = Instant) {
if (classA.dummy(instant)) classB.execute()
}

Joda 库中有一个实用程序函数,它设置当前时间,不需要传递时间作为参数。请参阅设置当前千分固定

例如:

import org.joda.time.DateTimeUtils
@Before
fun setUp() {
DateTimeUtils.setCurrentMillisFixed(DateTime(2020, 11, 5, 10, 0, 0).millis)
}
@After
fun cleanup() {
DateTimeUtils.setCurrentMillisSystem()
}

最新更新