【问题标题】:Scala determine if global ExecutionContext finished all tasksScala确定全局ExecutionContext是否完成了所有任务
【发布时间】:2017-05-12 22:34:31
【问题描述】:

我正在为异步执行一些非 io 任务并使用回调的服务编写一些测试。我需要每次测试都等到所有回调完成。是否可以确定

scala.concurrent.ExecutionContext.Implicits.global 

所有任务都完成了吗?

【问题讨论】:

    标签: scala executioncontext


    【解决方案1】:

    如果你有这样的服务:

    class MyService {
      def asyncDouble(i: Int): Future[Int] = Future.successful {
        Thread.sleep(1000)
        i * 2
      }
    }
    

    你可以用 ScalaTest 像这样测试它:

    import org.scalatest.FunSuite
    import org.scalatest.concurrent.ScalaFutures
    
    class MyServiceSpec extends FunSuite with ScalaFutures {
    
      test("Should double the input") {
        val service = new MyService
    
        val future = service.asyncDouble(10)
    
        whenReady(future) { result =>
          assert(result == 20)
        }
      }
    }
    

    或者,如果您正在制作剧本!应用程序并使用PlaySpec,然后您可以使用具有await 功能的Helpers

    import org.scalatestplus.play.PlaySpec
    import play.api.test.Helpers._
    
    class MyServiceSpec extends PlaySpec {
    
      "Should double the input" in {
        val service = new MyService
    
        val future = service.asyncDouble(10)
    
        val result = await(future)
        result mustEqual 20
      }
    }
    

    【讨论】:

    • 如果我能真正获得对我需要等待的期货的参考,那将起作用。这些是黑盒集成测试。我可能应该澄清这一点。
    • 你的服务函数不返回Future吗?或者你是在你的服务函数中触发异步代码而不是等待它?
    • 服务函数自身返回true/false是否输入有效。输入可能被分成批次、处理并最终写入某个目的地。我需要测试等待所有步骤完成,最好不要轮询。
    • 嗯,我认为在这种情况下,如果目标是某种数据库,我会模拟数据库并将模拟特征交给您的服务。这样您就可以检查正在传递的东西,现在有多少东西可以期待。
    • 我只是希望有一种简单、漂亮的方法来做到这一点。最终实现了我自己的执行上下文,并在底层 Java 执行器服务的每个测试结束时使用 awaitTermination。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多