RecoverMethods

org.scalatest.RecoverMethods
See theRecoverMethods companion object

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: recoverToSucceededIf and recoverToExceptionIf. Because this trait is mixed into trait AsyncTestSuite, 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:

recoverToSucceededIf[IllegalStateException] { // Result type: Future[Assertion]
 emptyStackActor ? Peek
}

The recoverToSucceededIf method performs a job similar to assertThrows, except in the context of a future. It transforms a Future of any type into a Future[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 recoverToExceptionIf method differs from the recoverToSucceededIf in its behavior when the assertion succeeds: recoverToSucceededIf yields a Future[Assertion], whereas recoverToExceptionIf yields a Future[T], where T is the expected exception type.

recoverToExceptionIf[IllegalStateException] { // Result type: Future[IllegalStateException]
 emptyStackActor ? Peek
}

In other words, recoverToExpectionIf is to intercept as recovertToSucceededIf is to assertThrows. 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 showing recoverToExceptionIf in 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]"))

Attributes

Companion
object
Graph
Supertypes
class Object
trait Matchable
class Any
Known subtypes

Members list

Value members

Concrete methods

def recoverToExceptionIf[T <: AnyRef](future: Future[Any])(implicit classTag: ClassTag[T], exCtx: ExecutionContext, pos: Position): Future[T]

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.

Value parameters

future

A future of any type, which you expect to fail with an exception of the specified type T

Attributes

Returns

a Future[T] containing on success the expected exception, or containing on failure a TestFailedException

def recoverToSucceededIf[T <: AnyRef](future: Future[Any])(implicit classTag: ClassTag[T], exCtx: ExecutionContext, pos: Position): Future[Assertion]

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.

Value parameters

future

A future of any type, which you expect to fail with an exception of the specified type T

Attributes

Returns

a Future[Assertion] containing on success the Succeeded singleton, or containing on failure a TestFailedException