Uma das principais características do Spring Boot é a sua simplicidade em permitir criar rapidamente uma aplicação sem abrir mão do design do seu código. E se você realmente quer fazer um trabalho de qualidade não pode abrir mão dos testes. Um bom modo de se fazer isso é com testes efetivos (não mocks) rodando no seu ambiente desenvolvimento. No trecho de códigos criamos o nosso primeiro teste.
package br.com.erudio; import java.io.IOException; import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import br.com.erudio.models.Person; import br.com.erudio.repository.PersonRepository; //Inicializamos o SpringRunner @RunWith(SpringRunner.class) //Setamos como uma classe de testes com o Server inicializando em uma porta fixa //Essa porta pode ser a 8080 ou a que desejarmos setada no nosso aplication.properties //Acesse src/test/resources/application.properties caso deseje alterar //No nosso caso é a 8888 como você pode ver no aplication.properties "server.port = 8888" @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) public class PersonEndpointTests { //URL base para onde as requests serão feitas final String BASE_PATH = "http://localhost:8888/person"; //Injetamos o repositório para acesso ao Banco de dados @Autowired private PersonRepository repository; //Definimos o restTemplate private RestTemplate restTemplate; //Definimos o JacksonMapper responsável por converter //JSON para Objeto e vice versa private ObjectMapper MAPPER = new ObjectMapper(); //Definimos o que será feito antes da execução do teste @Before public void setUp() throws Exception { //Deletamos todos os registros do banco repository.deleteAll(); //Inserimos alguma pessoas no banco repository.save(new Person("Diego", "Samuel", "Asa Sul")); repository.save(new Person("Eudes", "Silva", "Rosário")); repository.save(new Person("Anderson", "Silva", "Santa Teresa")); repository.save(new Person("Alice", "Ferreira", "Bombeiros")); repository.save(new Person("Alan", "Franco", "Granja Marileusa")); //Inicializamos o objeto restTemplate restTemplate = new RestTemplate(); } @Test public void testCreatePerson() throws JsonProcessingException{ //Criamos uma nova pessoa Person person = new Person("Leandro", "Costa", "Presidente Roosevelt"); //Fazemos um HTTP request do tipo POST passando a pessoa como parâmetro Person response = restTemplate.postForObject(BASE_PATH, person, Person.class); //Verificamos se o resultado da requisição é igual ao esperado //Se sim significa que tudo correu bem Assert.assertEquals("Leandro Costa", response.getFirstName() + " " + response.getLastName()); } }
Agora faremos um HTTP request do tipo GET para listar todas as pessoas ou uma em específico
@Test public void testFindOne() throws IOException{ //Fazemos uma requisição HTTP GET buscando por todas as pessoas String response = restTemplate .getForObject(BASE_PATH + "/findAll", String.class); //Convertemos a resposta JSON para Objeto usando op Jackson List<Person> persons = MAPPER.readValue(response, MAPPER.getTypeFactory().constructCollectionType(List.class, Person.class)); //Pegamos o ID da pessoa na posição 1 da lista e fazemos nova requisição //Recuperando as informações da mesma Person person = restTemplate.getForObject(BASE_PATH + "/" + persons.get(1).getIdPerson(), Person.class); //Verificamos se o resultado da requisição é igual ao esperado //Se sim significa que tudo correu bem Assert.assertNotNull(person); Assert.assertEquals("Eudes", person.getFirstName()); Assert.assertEquals("Silva", person.getLastName()); }
Agora faremos um HTTP request do tipo PUT para atualizar uma pessoa em específico
@Test public void testUpdatePerson() throws IOException{ String response = restTemplate.getForObject(BASE_PATH + "/findAll", String.class); List<Person> persons = MAPPER.readValue(response, MAPPER.getTypeFactory().constructCollectionType(List.class, Person.class)); //Pegamos o ID da pessoa na posição 2 da lista e fazemos nova requisição //Recuperando as informações da mesma Person person = restTemplate.getForObject(BASE_PATH + "/" + persons.get(2).getIdPerson(), Person.class); //Alteramos as informações da pessoa recuperada person.setFirstName("Tiago"); person.setLastName("Ferreira"); //Fazemos um HTTP request do tipo PUT passando a pessoa //e suas novas informações como parâmetro restTemplate.put(BASE_PATH, person); //como a operação PUT do RestTemplate é do tipo void //Precisamos fazer uma nova requisição para recuperar //as informações da pessoa atualizada Person person2 = restTemplate.getForObject(BASE_PATH + "/" + persons.get(2).getIdPerson(), Person.class); //Verificamos se o resultado da requisição é igual ao esperado //Se sim significa que tudo correu bem Assert.assertNotNull(person2); Assert.assertEquals("Tiago", person2.getFirstName()); Assert.assertEquals("Ferreira", person2.getLastName()); }
Sendo assim nos testamos as operações do nosso endpoint. Se quiser ver mais detalhes você pode baixar o código deste post aqui, descompactar o arquivo zip e importar na sua IDE preferida ou clonar usando Git:
git clone https://github.com/leandrocgsi/spring-boot-rest-with-mongodb-example.git
Você pode acessar outros posts sobre SpringBoot e REST aqui mesmo no blog.