在 Play 2 测试 + 期货中捕获异常

Catch exception in Play 2 Test + Futures

如何使用 play 测试在未来的成功中捕获异常?

这是我的代码:

"A Validity" should {
    "be created based on Client's Mobile" in new WithApplication {
      val objectId = UUIDs.timeBased()
      CValidityServiceModule.checkValidity(true, "MOBILE", clientId, objectId)
      val future = genericService.findByObjectIdAndByClientId(objectId, clientId)

      future.onComplete {
        case Success(s) => {
          s match {
            case Some(v) => {
              v.clientId mustEqual clientId
              v.objectId mustEqual objectId
            }
            case None => assert(false)
          }
        }
        case Failure(t) => {
          assert(false, t.getMessage)
        }
      }
    }

基本上,如果任何匹配器失败,它就会给我一个异常,但测试是绿色的。

有什么想法吗?

您需要等待 Future 完成后再进行测试。使用 onComplete 回调将不起作用,因为测试在 Future 之前完成,并且在不同的上下文中抛出异常。

Await.result 应该为您完成:

import scala.concurrent.Await
import scala.concurrent.duration.Duration
val future = genericService.findByObjectIdAndByClientId(objectId, clientId)
val s = Await.result(future, Duration.Inf)
s match {
  case Some(v) => {
    v.clientId mustEqual clientId
    v.objectId mustEqual objectId
  }
  case None => assert(false)
}