Вам нужно положить 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