Obtendo e verificando dados de resposta com garantia REST
1. Visão geral
Neste tutorial, discutiremos como testar serviços REST usando REST garantido, com foco emcapturing and validating the response data from our REST APIs.
2. Configuração para a classe de teste
Em tutoriais anteriores, exploramosREST-assured in general e mostramos como manipular a solicitaçãoheaders, cookies and parameters.
Com base nessa configuração existente, adicionamos um controlador REST simples,AppController, que chama internamente um serviçoAppService. Usaremos essas classes em nossos exemplos de teste.
Para criar nossa classe de teste, precisamos fazer um pouco mais de configuração. Como temosspring-boot-starter-test em nosso classpath, podemos aproveitar facilmente os utilitários de teste do Spring.
Primeiro, vamos criar o esqueleto de nossa classeAppControllerIntegrationTest:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class AppControllerIntegrationTest {
@LocalServerPort
private int port;
private String uri;
@PostConstruct
public void init() {
uri = "http://localhost:" + port;
}
@MockBean
AppService appService;
//test cases
}
Neste teste JUnit, anotamos nossa classe com algumas anotações específicas do Spring que ativam o aplicativo localmente em uma porta disponível aleatoriamente. Em@PostConstruct, capturamos o URI completo no qual faremos chamadas REST.
Também usamos@MockBean emAppService, pois precisamos simular chamadas de método nesta classe.
3. Validando a resposta JSON
JSON é o formato mais comum usado nas APIs REST para trocar dados. As respostas podem consistir em um único objeto JSON ou em uma matriz de objetos JSON. Veremos ambos nesta seção.
3.1. Objeto JSON único
Digamos que precisamos testar o endpoint/movie/{id}, que retorna um objeto JSONMovie seid for encontrado.
Simularemos chamadasAppService para retornar alguns dados simulados usando a estruturaMockito:
@Test
public void givenMovieId_whenMakingGetRequestToMovieEndpoint_thenReturnMovie() {
Movie testMovie = new Movie(1, "movie1", "summary1");
when(appService.findMovie(1)).thenReturn(testMovie);
get(uri + "/movie/" + testMovie.getId()).then()
.assertThat()
.statusCode(HttpStatus.OK.value())
.body("id", equalTo(testMovie.getId()))
.body("name", equalTo(testMovie.getName()))
.body("synopsis", notNullValue());
}
Acima, primeiro simulamos a chamadaappService.findMovie(1) para retornar um objeto. Em seguida, construímos nosso URL REST no métodoget() fornecido pelo REST-assegurado para fazer solicitações GET. Finalmente, fizemos quatro afirmações.
Primeiro,we checked the response status code and then the body elements. Estamos usandoHamcrest para afirmar o valor esperado.
Observe também que, se a resposta JSON estiver aninhada, podemos testar uma chave aninhada usando o operadordot como“key1.key2.key3”.
3.2. Extraindo a resposta JSON após a validação
Em alguns casos, podemos precisar extrair a resposta após a validação, para executar operações adicionais nela.
Podemos extrair a resposta JSON para uma classe, usando o métodoextract():
Movie result = get(uri + "/movie/" + testMovie.getId()).then()
.assertThat()
.statusCode(HttpStatus.OK.value())
.extract()
.as(Movie.class);
assertThat(result).isEqualTo(testMovie);
Neste exemplo, direcionamos REST-garantido para extrair a resposta JSON para um objetoMovie e, em seguida, declaramos no objeto extraído.
Também podemos extrair toda a resposta para umString, usando a APIextract().asString():
String responseString = get(uri + "/movie/" + testMovie.getId()).then()
.assertThat()
.statusCode(HttpStatus.OK.value())
.extract()
.asString();
assertThat(responseString).isNotEmpty();
Finalmente,we can extract a particular field out of the response JSON as well.
Vejamos um teste para uma API POST que espera um corpo JSONMovie e retornará o mesmo se inserida com sucesso:
@Test
public void givenMovie_whenMakingPostRequestToMovieEndpoint_thenCorrect() {
Map request = new HashMap<>();
request.put("id", "11");
request.put("name", "movie1");
request.put("synopsis", "summary1");
int movieId = given().contentType("application/json")
.body(request)
.when()
.post(uri + "/movie")
.then()
.assertThat()
.statusCode(HttpStatus.CREATED.value())
.extract()
.path("id");
assertThat(movieId).isEqualTo(11);
}
Acima, primeiro fizemos o objeto de solicitação que precisamos para o POST. We then extracted the id field from the returned JSON response using the path() method.
3.3. Matriz JSON
Também podemos verificar a resposta se for uma matriz JSON:
@Test
public void whenCallingMoviesEndpoint_thenReturnAllMovies() {
Set movieSet = new HashSet<>();
movieSet.add(new Movie(1, "movie1", "summary1"));
movieSet.add(new Movie(2, "movie2", "summary2"));
when(appService.getAll()).thenReturn(movieSet);
get(uri + "/movies").then()
.statusCode(HttpStatus.OK.value())
.assertThat()
.body("size()", is(2));
}
Mais uma vez, primeiro simulamosappService.getAll() com alguns dados e fizemos uma solicitação ao nosso endpoint. We then asserted the statusCode and size of our response array.
Isso novamente pode ser feito via extração:
Movie[] movies = get(uri + "/movies").then()
.statusCode(200)
.extract()
.as(Movie[].class);
assertThat(movies.length).isEqualTo(2);
4. Validando cabeçalhos e cookies
Podemos verificar um cabeçalho ou cookie da resposta usando métodos com o mesmo nome:
@Test
public void whenCallingWelcomeEndpoint_thenCorrect() {
get(uri + "/welcome").then()
.assertThat()
.header("sessionId", notNullValue())
.cookie("token", notNullValue());
}
Também podemos extrair os cabeçalhos e cookies individualmente:
Response response = get(uri + "/welcome");
String headerName = response.getHeader("sessionId");
String cookieValue = response.getCookie("token");
assertThat(headerName).isNotBlank();
assertThat(cookieValue).isNotBlank();
5. Validando arquivos
Se nossa API REST retornar um arquivo, podemos usar o métodoasByteArray() para extrair a resposta:
File file = new ClassPathResource("test.txt").getFile();
long fileSize = file.length();
when(appService.getFile(1)).thenReturn(file);
byte[] result = get(uri + "/download/1").asByteArray();
assertThat(result.length).isEqualTo(fileSize);
Aqui, primeiro simulamosappService.getFile(1) para retornar um arquivo de texto que está presente em nosso caminhosrc/test/resources. Em seguida, fizemos uma chamada para nosso endpoint e extraímos a resposta embyte[], que afirmamos ter o valor esperado.
6. Conclusão
Neste tutorial, examinamos diferentes maneiras de capturar e validar respostas de nossas APIs REST usando a garantia REST.
Como de costume, o código neste artigo está disponívelover on Github.