Multithreading Scala避免异步测试用例的线程休眠

Multithreading Scala避免异步测试用例的线程休眠,multithreading,scala,testing,future,Multithreading,Scala,Testing,Future,我正在为一个方法编写单元测试,该方法运行一个主函数,然后异步记录有关请求的详细信息 defsomemethod(数据:对象):SomeType= 为了{ 结果(源位置) .verify(其中{(msg:RichMsg,{,},{,}=> msg.toString.equals(s“某些特定消息”) }) } 我不喜欢添加线程。每当我需要确保记录器接收到特定消息时,请睡眠。我希望能够包装stubLogger期望值 如果需要更多信息,请告诉我。我认为您需要在logMethod中添加promise。

我正在为一个方法编写单元测试,该方法运行一个主函数,然后异步记录有关请求的详细信息

defsomemethod(数据:对象):SomeType=
为了{
结果(源位置)
.verify(其中{(msg:RichMsg,{,},{,}=>
msg.toString.equals(s“某些特定消息”)
})
}
我不喜欢添加
线程。每当我需要确保记录器接收到特定消息时,请睡眠
。我希望能够包装
stubLogger
期望值


如果需要更多信息,请告诉我。

我认为您需要在
logMethod
中添加
promise
。 根据:

而期货被定义为一种只读占位符对象 为了一个还不存在的结果而创造,一个承诺可以被考虑 作为可写的单个赋值容器,它完成 未来。也就是说,一个承诺可以用来成功地完成一个项目 用成功来实现有价值的未来(通过“完成”承诺) 方法。相反,承诺也可以用来完成未来 例外情况下,通过不履行承诺,使用失败方法

承诺p完成了p.future返回的未来。这个未来是 具体到承诺p。根据实施情况,它可能是 未来等式p

在测试中,一旦返回结果,就可以将结果与要比较的消息进行比较

示例代码如下所示:

object Test1 extends App {
  import scala.concurrent.{Future, Promise}
  import scala.concurrent.ExecutionContext.Implicits.global
  import scala.util.{Success, Failure}

  var promiseMessage: String = _
  val promise = Promise[String] //The promise will hold a string

  //A future tells the System to spawn a new thread and run the code block inside it
  val logMethod =  (elem: String) => Future{
    promise.success(elem)
    elem
  }

  def method(data: String): Future[String] = {
    for {
      result <- logMethod(data)
    } yield result
  }

  val f1 = method("Hi!! I love scala async programming")

  promise completeWith f1
  val promiseFuture = promise.future

  promiseFuture onComplete {
    case Success(value) =>
      promiseMessage = value
      println(promiseMessage)
    case Failure(ex) => println(ex)
  }

  Await.result(promiseFuture, 100 seconds)

  if (promiseMessage == "Hi!! I love scala async programming") println("correct")
}
objecttest1扩展应用程序{
导入scala.concurrent.{Future,Promise}
导入scala.concurrent.ExecutionContext.Implicits.global
导入scala.util.{成功,失败}
var promiseMessage:字符串=_
val promise=promise[String]//承诺将包含一个字符串
//未来将告诉系统生成一个新线程并在其中运行代码块
val logMethod=(elem:String)=>Future{
承诺。成功(要素)
元素
}
def方法(数据:字符串):Future[String]={
为了{
结果
承诺信息=价值
println(承诺信息)
案例失败(ex)=>println(ex)
}
等待结果(承诺未来,100秒)
if(promiseMessage==“嗨!!我喜欢scala异步编程”)println(“正确”)
}
在代码中,
promise
是一个promise对象,它在未来完成时承诺一个字符串。您需要做的就是用未来完成承诺,如所示:
promise complete with f1
,然后使用
promiseFuture onComplete
添加一个处理程序,说明在成功或失败时该怎么做

如果要检查是否发生了日志记录,您可以在
promiseFuture
等待
,或者继续进一步的过程,当日志记录完成时,promise将打印成功的,如代码所示


让我知道它有帮助!!

您使用的是什么测试库?