代码之家  ›  专栏  ›  技术社区  ›  JohnBigs

scalatest intercept vs[Exception]应该是thrownBy

  •  0
  • JohnBigs  · 技术社区  · 6 年前

    Future 失败了,我尝试了两种不同的方法,一种有效:

    intercept[NoSuchElementException] {
      Await.result(dao.findById("some_id"), Duration.Inf)
    }
    

    还有一个没有:

    a[NoSuchElementException] should be thrownBy dao.findById("some_id")
    

    我很想得到一些帮助来理解这一点。

    findById NoSuchElementException 如果失败:

      def findById(id: String): Future[Person] = {
        collection.find(json(Vendor.PersonId -> id))
          .requireOne[Person] recover {
          case NoSuchResultException => throw new NoSuchElementException
        }
      }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Luca T.    6 年前

    Future

    根据这个定义:

    def findById(id: String): Future[Person] = {
      collection.find(json(Vendor.PersonId -> id))
        .requireOne[Person] recover {
         case NoSuchResultException => throw new NoSuchElementException
        }
    }
    

    recover NoSuchResultException 变成一个 throw new NoSuchElementException ,但它总是被包裹在 未来

    这意味着返回的对象将是失败的 未来 方法不会抛出任何异常。

    例如,为了处理这种情况,可以在测试类中使用 ScalaFutures 比例测试中的特征。这有助于你像这样处理未来

    dao.findById("some_id").failed.futureValue should be a[NoSuchElementException]
    
        2
  •  2
  •   Joe K    6 年前

    考虑一下这是否是实施:

    def findById(id: String): Future[Person] = Future {
      Thread.sleep(1000)
      throw new NoSuchElementException()
    }
    

    findById 本身不会引发异常。它立即返回这个未来。异常在 Future Await 在结果上,或以其他方式获得未来的结果。