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将打印成功的,如代码所示
让我知道它有帮助!!您使用的是什么测试库?