Scala mockito: Delay Mockito.when().thenReturn(someFuture)


val future = new CompletableFuture()
future.complete(someObject)
Mockito.when(_).thenReturn{
    future
}

对于上述代码,我想测试情况,如果瓦尔未来有延迟:完整的future可以完成。

我如何迫使未来延迟归纳?

我尝试了类似的东西:

Mockito.when(_).thenReturn{
    Thread.sleep(2000)
    future
}

但是它不起作用

您可以使用thenAnswer而不是thenReturn来模拟等待时间。

请参阅此-https://static.javadoc.io/org.mockito/mockito-core/2.27.0/org/mockito/stubbing/answer.html

以下是Java等效代码 -

Mockito.when(<your method call>).thenAnswer(new Answer<CompletableFuture>() {
   @Override
   public String answer(InvocationOnMock invocation){
      Thread.sleep(2000);
      return future;
   }
})

您需要将Thread.sleep(2000)放在将来。

您可能想实现这样的目标:

import java.time.Instant
import java.util.concurrent.CompletableFuture
import org.mockito.Mockito
import org.mockito.Mockito.when
object MainClass {
  def main(args: Array[String]): Unit = {
    val mock = Mockito.mock(classOf[SomeTrait])
    when(mock.doSmth).thenReturn(CompletableFuture.supplyAsync[String](() => {
      println(s"[${Instant.now()}] run future")
      try {
        Thread.sleep(2000)
        "Something"
      } finally {
        println(s"[${Instant.now()}] end future")
      }
    }))
    val future = mock.doSmth
    println(s"[${Instant.now()}] end main")
    future.get()
    println(s"[${Instant.now()}] result: ${future.get()}")
  }
}
trait SomeTrait {
  def doSmth: CompletableFuture[String]
}

输出:

[2019-05-13T20:55:34.079Z] end main
[2019-05-13T20:55:34.079Z] run future
[2019-05-13T20:55:36.096Z] end future
[2019-05-13T20:55:36.097Z] result: Something

P.S。当您将其声明为返回时,执行完整的future开始。如果您需要在此声明后的某个时候开始执行未来 - 您必须使用scala.concurrent.Promise并通过scala.concurrent.Future

包装完整的future

使用Mockito-Scala您可以写

之类的东西
when(_) thenAnswer {
   Thread.sleep(2000)
   future
}

可以说更干净,更容易理解

最新更新