Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.


Advertencia

Se está reestructurando esta documentación


Para hacer tests sobre los métodos de nuestros controladores REST, utilizaremos Junit Mockito. Veamos en primer lugar un ejemplo completo, para pasar a explicarlo a continuación:

...

Bloque de código
languagejava
@Test
public void getComponenteById() {
    Long id = 1L;
 
    Componente found = restComunicaciones.getComponente(id);
    assertThat(found.getId()).isEqualTo(id);
}






Clases de tests

Las clases en las que situemos nuestros tests tendrás que ir precedidas de la anotación @SpringBootTest:

Bloque de código
languagejava
@SpringBootTest
public class RestExpedientesTest {
	...
}

Y cada test individual, será un método con la anotación @Test:

Bloque de código
languagejava
@Test
void getExpedienteTest() {

}

Before: ejecutar código antes de los tests

Disponemos de las anotaciones @BeforeEach y @BeforeAll para indicar código que queremos que se ejecute antes de cada test, o antes de todos los tests, respectivamente. Por ejemplo, para indicar que queremos hacer un mock (los mocks se explican más adelante) de la propiedad que contiene el secret antes de los tests, podemos hacerlo así:

Bloque de código
languagejava
@BeforeEach
void mocksecret() {
	ReflectionTestUtils.setField( jwtTokenUtil, "secret", "secreto" );
}

Comprobar valores

En nuestros tests, disponemos de diferentes formas de hacer aserciones. La primera de ellas, para comprobar valores, sería utilizando assertThat, que proporciona diferentes métodos para comprobar los valores (isNull, isEmpty, isEqualTo, etc.): 

Bloque de código
languagejava
import static org.assertj.core.api.Assertions.assertThat;


assertThat( titulaciones ).isNotNull();
assertThat( titulaciones ).isNotEmpty();
assertThat( precio ).isEqualTo( 27 );

Si queremos simular testear errores en nuestras aplicaciónes podemos utilizar assertThrows para comprobar que se lanza una excepción, especificando la clase de la excepción que se espera, y las instrucciones a ejecutar a ejecutar en un bloque de código del tipo () → { ... }:

Bloque de código
import static org.junit.jupiter.api.Assertions.assertThrows;

assertThrows( TokenExpiredException.class, () -> jwtTokenUtil.getClaim( "Bearer " + tokenCaducado ) );
assertThrows( UnauthorizedException.class, () -> jwtTokenUtil.getClaim( "asdf" ) );

Mocks

Podemos mockear una propiedad de un objeto como hemos visto en un ejemplo anterior, utilizando ReflectionTestUtils.setField, indicando el objeto, el nombre de la propiedad, y el valor a asignarle:

Bloque de código
languagejava
@BeforeEach
void mocksecret() {
	ReflectionTestUtils.setField( jwtTokenUtil, "secret", "secreto" );
}

Para hacer un mock de un métido, disponemos de Mockito.when(...), al que le indicamos el método, con sus argumentos, y que posteriormente nos ofrece varios métodos para la respuesta, como .thenReturn( ... ) para indicar el valor a devolver o .thenThrow( ... ) para indicar una excepción a lanzar. En el siguiente ejemplo podemos ver dos ejemplos de esto para hacer un mock de getClaims, creando un token previamente, pasando un valor concreto como argumento o indicando que cualquier String:

Bloque de código
import static org.mockito.ArgumentMatchers.any;

...

Map<String, Object> infoUser = new HashMap<>();
infoUser.put( "roleName", "G_OTROS" );
final Instant now = Instant.now();
// Creamos token con el usuario "guillermo.castillo@ticarum.es", codificado con el secret "secreto"
String token = Jwts.builder().setClaims( infoUser ).setSubject( "guillermo.castillo@ticarum.es" )
		.setIssuedAt( Date.from( now ) ).setExpiration( Date.from( now.plus( Duration.ofDays( 123 ) ) ) )
		.signWith( SignatureAlgorithm.HS256, TextCodec.BASE64.encode( "secreto" ) ).compact();

final Claims claims = Jwts.parser().setSigningKey( TextCodec.BASE64.encode( "secreto" ) ).parseClaimsJws( token ).getBody();

// Mock getClaims
Mockito.when( jwtTokenUtil.getClaim( "asdf" ) ).thenReturn(claims);

// Mock getClaims con cualquier argumento String
Mockito.when( jwtTokenUtil.getClaim( any(String.class) ).thenReturn(claims);

Simular peticiones a servicio REST