Transforms a future of any type into a Future[T], where T is a given
expected exception type, which succeeds if the given future
completes with a Failure containing the specified exception type.
Transforms a future of any type into a Future[T], where T is a given
expected exception type, which succeeds if the given future
completes with a Failure containing the specified exception type.
See the main documentation for this trait for more detail and examples.
A future of any type, which you expect to fail with an exception of the specified type T
a Future[T] containing on success the expected exception, or containing on failure
a TestFailedException
Transforms a future of any type into a Future[Assertion] that succeeds if the future
completes with a Failure containing the specified exception type.
Transforms a future of any type into a Future[Assertion] that succeeds if the future
completes with a Failure containing the specified exception type.
See the main documentation for this trait for more detail and examples.
A future of any type, which you expect to fail with an exception of the specified type T
a Future[Assertion] containing on success the Succeeded singleton, or containing on failure
a TestFailedException
Offers two methods for transforming futures when exceptions are expected.
This trait offers two methods for testing for expected exceptions in the context of futures:
recoverToSucceededIfandrecoverToExceptionIf. Because this trait is mixed into traitAsyncTestSuite, both of its methods are available by default in any async-style suite.If you just want to ensure that a future fails with a particular exception type, and do not need to inspect the exception further, use
recoverToSucceededIf:The
recoverToSucceededIfmethod performs a job similar toassertThrows, except in the context of a future. It transforms aFutureof any type into aFuture[Assertion]that succeeds only if the original future fails with the specified exception. Here's an example in the REPL:scala> import org.scalatest.RecoverMethods._ import org.scalatest.RecoverMethods._ scala> import scala.concurrent.Future import scala.concurrent.Future scala> import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global scala> recoverToSucceededIf[IllegalStateException] { | Future { throw new IllegalStateException } | } res0: scala.concurrent.Future[org.scalatest.Assertion] = ... scala> res0.value res1: Option[scala.util.Try[org.scalatest.Assertion]] = Some(Success(Succeeded))Otherwise it fails with an error message similar to those given by
assertThrows:scala> recoverToSucceededIf[IllegalStateException] { | Future { throw new RuntimeException } | } res2: scala.concurrent.Future[org.scalatest.Assertion] = ... scala> res2.value res3: Option[scala.util.Try[org.scalatest.Assertion]] = Some(Failure(org.scalatest.exceptions.TestFailedException: Expected exception java.lang.IllegalStateException to be thrown, but java.lang.RuntimeException was thrown)) scala> recoverToSucceededIf[IllegalStateException] { | Future { 42 } | } res4: scala.concurrent.Future[org.scalatest.Assertion] = ... scala> res4.value res5: Option[scala.util.Try[org.scalatest.Assertion]] = Some(Failure(org.scalatest.exceptions.TestFailedException: Expected exception java.lang.IllegalStateException to be thrown, but no exception was thrown))The
recoverToExceptionIfmethod differs from therecoverToSucceededIfin its behavior when the assertion succeeds:recoverToSucceededIfyields aFuture[Assertion], whereasrecoverToExceptionIfyields aFuture[T], whereTis the expected exception type.In other words,
recoverToExpectionIfis tointerceptasrecovertToSucceededIfis toassertThrows. The first one allows you to perform further assertions on the expected exception. The second one gives you a result type that will satisfy the type checker at the end of the test body. Here's an example showingrecoverToExceptionIfin the REPL:scala> val futureEx = | recoverToExceptionIf[IllegalStateException] { | Future { throw new IllegalStateException("hello") } | } futureEx: scala.concurrent.Future[IllegalStateException] = ... scala> futureEx.value res6: Option[scala.util.Try[IllegalStateException]] = Some(Success(java.lang.IllegalStateException: hello)) scala> futureEx map { ex => assert(ex.getMessage == "world") } res7: scala.concurrent.Future[org.scalatest.Assertion] = ... scala> res7.value res8: Option[scala.util.Try[org.scalatest.Assertion]] = Some(Failure(org.scalatest.exceptions.TestFailedException: "[hello]" did not equal "[world]"))