Mockk:如何模拟延迟后的返回?

Ond*_*žka 6 mocking kotlin mockk

我需要模拟对某个课程的调用,并使其需要一些时间。

当前的代码使用这个:

every { useCase.execute(any()) } answers {
    AnswersWithDelay(50000, DoesNothing.doesNothing())
}
Run Code Online (Sandbox Code Playgroud)

现在我正在更改execute()以返回类的对象Notification

val notif = Notification(...)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何改变这个模拟。

val answer: org.mockito.stubbing.Answer<Notification> = AdditionalAnswers.answer { invocation: InvocationOnMock -> notif }
val delayedAnswer = AdditionalAnswers.answersWithDelay(50000, { invocation: InvocationOnMock -> answer } )
Run Code Online (Sandbox Code Playgroud)

我找不到如何进行answers { ... }编译。有小费吗?

Ond*_*žka 7

Mockito 和 MockK API 有点令人困惑,因为它们共享术语,但不兼容。MockKio.mockk.Answer与 Mockito 不兼容org.mockito.stubbing.Answer,从那里开始,所有其他 util 类也不匹配。

因此,虽然最初它可以使用DoesNothing.doesNothing(),因为返回类型是Unit/ void,但对于返回类型,模拟必须使用 MockK 的惯用方式创建。

所以我采取了:

    val answerF = FunctionAnswer { Thread.sleep(50000); notif }
    every { useCase.execute(any()) } .answers(answerF)
Run Code Online (Sandbox Code Playgroud)