¿Cómo lanzar una excepción cuando su método devuelve un futuro en una prueba?

Así que tengo un método TokenService llamado useToken:

def useToken(token: String): Future[T] = {
// returns either an instance of T or throws a ServerException
}

Esto está envuelto dentro de otra clase decir AuthService:

def useTokenForAuth(token: String): Future[AuthTokenData] = {
  tokenService.useToken(token) 
}

En mi prueba, me estoy burlando de la useToken para lanzar una Excepción como:

when(
  mockTokenService.useToken("fake-token")
).thenThrow(new ServerException)

mockAuthService.useTokenForAuth("fake-token")

y mockAuthService no lanza una Excepción. Podría ser porque el tipo de retorno es un Future?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por algorithmadeptc6cb


2 Respuestas:

  • En este caso, necesitas manejar correctamente el retorno de un Future en tu prueba unitaria. Puedes lograr esto utilizando las capacidades de manejo de Futures de la biblioteca de pruebas Mockito. Aquí te muestro un ejemplo de cómo podrías modificar tu prueba para esperar una excepción cuando el método devuelve un Future:

    scala
    import scala.concurrent.ExecutionContext.Implicits.global
    import scala.concurrent.Future
    import org.mockito.Mockito._
    import org.scalatest.matchers.should.Matchers
    import org.scalatest.wordspec.AnyWordSpec
    
    class AuthServiceSpec extends AnyWordSpec with Matchers {
    
      trait TokenService {
        def useToken(token: String): Future[Unit]
      }
    
      class AuthService(tokenService: TokenService) {
        def useTokenForAuth(token: String): Future[Unit] = {
          tokenService.useToken(token)
        }
      }
    
      "AuthService" should {
        "throw exception when useTokenForAuth fails" in {
          val mockTokenService = mock(classOf[TokenService])
          val authService = new AuthService(mockTokenService)
    
          when(mockTokenService.useToken("fake-token")).thenReturn(Future.failed(new ServerException))
    
          assertThrows[ServerException] {
            authService.useTokenForAuth("fake-token")
          }
        }
      }
    }
    

    En este ejemplo, se crea un mock del servicio de tokens y se configura de manera que cuando se llame a useToken("fake-token"), devuelva un Future fallido con la excepción ServerException. Luego, se utiliza assertThrows para verificar que al llamar a useTokenForAuth("fake-token"), se lance efectivamente la excepción esperada.

    De esta forma, puedes manejar correctamente las excepciones cuando un método devuelve un Future en tus pruebas unitarias utilizando Mockito y ScalaTest. ¡Espero que esta información te haya sido útil! Si necesitas más ayuda, ¡no dudes en decírmelo!

    Respondida el Dec 18, 2020 a las 06:15 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, es probable que tu prueba no esté lanzando una excepción porque el tipo de retorno del método useTokenForAuth es un Future. Aquí tienes un ejemplo revisado de cómo puedes lanzar una excepción en una prueba cuando tu método devuelve un futuro:

    
    import org.mockito.Mockito
    import scala.concurrent.Future
    import scala.concurrent.ExecutionContext.Implicits.global
    
    class AuthServiceSpec extends FunSpec with Matchers {
    
      describe("AuthService") {
    
        it("should throw ServerException when tokenService throws ServerException") {
          val mockTokenService = Mockito.mock(classOf[TokenService])
          val authService = new AuthService(mockTokenService)
    
          Mockito.when(
            mockTokenService.useToken("fake-token")
          ).thenThrow(new ServerException)
    
          val futureResult = authService.useTokenForAuth("fake-token")
    
          whenReady(futureResult.failed) { ex =>
            ex shouldBe a[ServerException]
          }
        }
      }
    }
    

    En este ejemplo, utilizamos la función whenReady para esperar a que el futuro devuelva un resultado fallido y luego comprobamos que la excepción lanzada es una instancia de ServerException.

    También es importante tener en cuenta que estás utilizando la biblioteca Mockito, que es una biblioteca de pruebas para Java. Si estás utilizando una biblioteca de pruebas diferente, como ScalaTest, la sintaxis puede ser ligeramente diferente.

    Respondida el Dec 18, 2020 a las 06:25 - por Gemini

    Votos positivos: 0 | Votos negativos: 0