Searching...
viernes, 16 de junio de 2023

Pruebas unitarias de tipo mock en ScalaTest (SsmUtils)

 No es posible simular la instanciación de un cliente SsmClient con un Parameter Store en local para pruebas unitarias utilizando credenciales anónimas. La biblioteca AWS SDK requiere autenticación válida para acceder a los servicios de AWS, incluido Parameter Store.

En las pruebas unitarias, es recomendable utilizar enfoques de simulación o mocking para simular el comportamiento de las llamadas a servicios externos, en lugar de intentar ejecutarlos localmente. Puedes utilizar bibliotecas de simulación como Mockito, MockServer u otros frameworks similares para simular las respuestas de las llamadas a los servicios de AWS, incluyendo la respuesta del Parameter Store.

En lugar de interactuar con el Parameter Store real durante las pruebas unitarias, puedes crear mocks o stubs para simular las respuestas del Parameter Store y probar el comportamiento de tu código en función de esas respuestas simuladas. Esto te permitirá aislar tus pruebas y hacerlas más rápidas, predecibles y menos dependientes de recursos externos como el Parameter Store de AWS.

Recuerda que las pruebas unitarias se centran en probar la lógica interna de tu código de manera aislada, sin depender de servicios externos. Por lo tanto, es preferible simular o simular parcialmente los servicios externos para garantizar pruebas más confiables y eficientes.

import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers import software.amazon.awssdk.services.ssm.SsmClient import software.amazon.awssdk.services.ssm.model.{GetParameterRequest, GetParameterResponse} trait MyParameterStore { implicit val ssmClient: SsmClient def getParameterValue(parameterName: String): String = { val request = GetParameterRequest.builder() .name(parameterName) .build() val response = ssmClient.getParameter(request) response.parameter().value() } } class MyParameterStoreSpec extends AnyFlatSpec with Matchers with MyParameterStore { // Cliente Ssm simulado para las pruebas implicit val ssmClient: SsmClient = new SsmClient { override def getParameter(request: GetParameterRequest): GetParameterResponse = { request.name() match { case "parameter1" => GetParameterResponse.builder() .parameter(Parameter.builder() .name(request.name()) .value("value1") .build()) .build() case "parameter2" => GetParameterResponse.builder() .parameter(Parameter.builder() .name(request.name()) .value("value2") .build()) .build() case _ => throw new IllegalArgumentException(s"Unknown parameter: ${request.name()}") } } } "MyParameterStore" should "obtener un parámetro del Parameter Store" in { val parameterValue1 = getParameterValue("parameter1") parameterValue1 should be("value1") val parameterValue2 = getParameterValue("parameter2") parameterValue2 should be("value2") } }


En este ejemplo, el trait MyParameterStore define un valor implícito ssmClient de tipo SsmClient. La clase de prueba MyParameterStoreSpec extiende AnyFlatSpec, Matchers y MyParameterStore. Al mezclar MyParameterStore en la clase de prueba, se puede sobrescribir el valor implícito ssmClient para utilizar un cliente Ssm simulado en lugar de uno real.

Dentro del cliente Ssm simulado, se utiliza una coincidencia de patrones (match) para determinar qué parámetro se está solicitando y devolver una respuesta simulada correspondiente. En el ejemplo, se simulan dos parámetros diferentes: "parameter1" y "parameter2", con sus respectivos valores "value1" y "value2".

En el caso de prueba, se llama al método getParameterValue de MyParameterStore y se verifica que los valores de los parámetros sean los esperados.

Recuerda adaptar este código a tus necesidades específicas y utilizar los nombres de parámetros y valores correctos para tu caso de uso.


0 comentarios:

Publicar un comentario

Gracias por participar en esta página.

 
Back to top!