Scala mockito: Задержка Mockito.when (). ThenReturn (someFuture) - PullRequest
0 голосов
/ 13 мая 2019
val future = new CompletableFuture()
future.complete(someObject)

Mockito.when(_).thenReturn{
    future
}

для приведенного выше кода, я хочу проверить ситуацию, если есть задержка в val будущем: CompletableFuture завершена.

как я могу заставить будущее задержать в thenReturn?

Я пробовал что-то вроде:

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

, но это не работает

Ответы [ 3 ]

3 голосов
/ 13 мая 2019

Вы можете использовать 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;
   }
})
2 голосов
/ 13 мая 2019

Вам нужно положить 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. выполнение CompletableFuture начинается, когда вы объявляете его для возврата. Если вам нужно начать выполнение будущего через некоторое время после этой декларации - вы должны использовать scala.concurrent.Promise и обернуть ваш CompletableFuture на scala.concurrent.Future

0 голосов
/ 14 мая 2019

С mockito-scala вы можете написать что-то вроде

when(_) thenAnswer {
   Thread.sleep(2000)
   future
}

, что, возможно, чище и проще для понимания

...