{"id":1014,"date":"2017-02-15T05:58:15","date_gmt":"2017-02-15T08:58:15","guid":{"rendered":"https:\/\/www.erudio.com.br\/blog\/?p=1014"},"modified":"2017-02-15T05:58:15","modified_gmt":"2017-02-15T08:58:15","slug":"testando-servicos-rest-com-spring-boot-e-resttemplate","status":"publish","type":"post","link":"https:\/\/www.erudio.com.br\/blog\/testando-servicos-rest-com-spring-boot-e-resttemplate\/","title":{"rendered":"Testando servi\u00e7os REST com Spring Boot e RestTemplate"},"content":{"rendered":"<p>Uma das principais caracter\u00edsticas do Spring Boot \u00e9 a sua simplicidade em permitir criar rapidamente uma aplica\u00e7\u00e3o sem abrir m\u00e3o do design do seu c\u00f3digo. E se voc\u00ea realmente quer fazer um trabalho de qualidade n\u00e3o pode abrir m\u00e3o dos testes. Um bom modo de se fazer isso \u00e9 com testes efetivos (n\u00e3o mocks) rodando no seu ambiente desenvolvimento. No trecho de c\u00f3digos criamos o nosso primeiro teste.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage br.com.erudio;\n\nimport java.io.IOException;\nimport java.util.List;\n\nimport org.junit.Assert;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.web.client.RestTemplate;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport br.com.erudio.models.Person;\nimport br.com.erudio.repository.PersonRepository;\n\n\/\/Inicializamos o SpringRunner\n@RunWith(SpringRunner.class)\n\/\/Setamos como uma classe de testes com o Server inicializando em uma porta fixa\n\/\/Essa porta pode ser a 8080 ou a que desejarmos setada no nosso aplication.properties\n\/\/Acesse src\/test\/resources\/application.properties caso deseje alterar\n\/\/No nosso caso \u00e9 a 8888 como voc\u00ea pode ver no aplication.properties &quot;server.port = 8888&quot;\n@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)\npublic class PersonEndpointTests {\n    \n    \/\/URL base para onde as requests ser\u00e3o feitas\n    final String BASE_PATH = &quot;http:\/\/localhost:8888\/person&quot;;\n\n    \/\/Injetamos o reposit\u00f3rio para acesso ao Banco de dados\n    @Autowired\n    private PersonRepository repository;\n\t\n    \/\/Definimos o restTemplate\n    private RestTemplate restTemplate;\n    \n    \/\/Definimos o JacksonMapper respons\u00e1vel por converter\n    \/\/JSON para Objeto e vice versa\n    private ObjectMapper MAPPER = new ObjectMapper();\n    \n    \/\/Definimos o que ser\u00e1 feito antes da execu\u00e7\u00e3o do teste\n    @Before\n    public void setUp() throws Exception {\n\n        \/\/Deletamos todos os registros do banco\n        repository.deleteAll();\n\n        \/\/Inserimos alguma pessoas no banco\n        repository.save(new Person(&quot;Diego&quot;, &quot;Samuel&quot;, &quot;Asa Sul&quot;));\n        repository.save(new Person(&quot;Eudes&quot;, &quot;Silva&quot;, &quot;Ros\u00e1rio&quot;));\n        repository.save(new Person(&quot;Anderson&quot;, &quot;Silva&quot;, &quot;Santa Teresa&quot;));\n\trepository.save(new Person(&quot;Alice&quot;, &quot;Ferreira&quot;, &quot;Bombeiros&quot;));\n\trepository.save(new Person(&quot;Alan&quot;, &quot;Franco&quot;, &quot;Granja Marileusa&quot;));        \n       \n        \/\/Inicializamos o objeto restTemplate\n        restTemplate = new RestTemplate();\n    }\n    \n    @Test\n    public void testCreatePerson() throws JsonProcessingException{\n\n        \/\/Criamos uma nova pessoa\n        Person person = new Person(&quot;Leandro&quot;, &quot;Costa&quot;, &quot;Presidente Roosevelt&quot;);\n\n        \/\/Fazemos um HTTP request do tipo POST passando a pessoa como par\u00e2metro\n        Person response = restTemplate.postForObject(BASE_PATH, person, Person.class);\n\n        \/\/Verificamos se o resultado da requisi\u00e7\u00e3o \u00e9 igual ao esperado\n        \/\/Se sim significa que tudo correu bem\n        Assert.assertEquals(&quot;Leandro Costa&quot;, response.getFirstName() + &quot; &quot; + response.getLastName());\n    }\n    \n  \n\n}\n<\/pre>\n<p>Agora faremos um HTTP request do tipo GET para listar todas as pessoas ou uma em espec\u00edfico<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n    @Test\n    public void testFindOne() throws IOException{\n\n        \/\/Fazemos uma requisi\u00e7\u00e3o HTTP GET buscando por todas as pessoas\n    \tString response = restTemplate\n\t\t\t.getForObject(BASE_PATH + &quot;\/findAll&quot;, String.class);\n\n        \/\/Convertemos a resposta JSON para Objeto usando op Jackson\n        List&lt;Person&gt; persons = MAPPER.readValue(response, \n\t\t\tMAPPER.getTypeFactory().constructCollectionType(List.class, Person.class));\n        \/\/Pegamos o ID da pessoa na posi\u00e7\u00e3o 1 da lista e fazemos nova requisi\u00e7\u00e3o\n        \/\/Recuperando as informa\u00e7\u00f5es da mesma\n        Person person = restTemplate.getForObject(BASE_PATH + &quot;\/&quot; +\n\t\t\tpersons.get(1).getIdPerson(), Person.class);\n        \n        \/\/Verificamos se o resultado da requisi\u00e7\u00e3o \u00e9 igual ao esperado\n        \/\/Se sim significa que tudo correu bem\n        Assert.assertNotNull(person);\n    \tAssert.assertEquals(&quot;Eudes&quot;, person.getFirstName());\n    \tAssert.assertEquals(&quot;Silva&quot;, person.getLastName());\n    }\n<\/pre>\n<p>Agora faremos um HTTP request do tipo PUT para atualizar uma pessoa em espec\u00edfico<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">    \n    @Test\n    public void testUpdatePerson() throws IOException{\n    \tString response = restTemplate.getForObject(BASE_PATH + &quot;\/findAll&quot;, String.class);\n        List&lt;Person&gt; persons = MAPPER.readValue(response,\n\t\t\tMAPPER.getTypeFactory().constructCollectionType(List.class, Person.class));\n        \n        \/\/Pegamos o ID da pessoa na posi\u00e7\u00e3o 2 da lista e fazemos nova requisi\u00e7\u00e3o\n        \/\/Recuperando as informa\u00e7\u00f5es da mesma\n        Person person = restTemplate.getForObject(BASE_PATH + &quot;\/&quot; +\n\t\t\tpersons.get(2).getIdPerson(), Person.class);\n\n        \/\/Alteramos as informa\u00e7\u00f5es da pessoa recuperada\n        person.setFirstName(&quot;Tiago&quot;);\n        person.setLastName(&quot;Ferreira&quot;);\n\n        \/\/Fazemos um HTTP request do tipo PUT passando a pessoa \n        \/\/e suas novas informa\u00e7\u00f5es como par\u00e2metro\n        restTemplate.put(BASE_PATH, person);\n        \n        \/\/como a opera\u00e7\u00e3o PUT do RestTemplate \u00e9 do tipo void\n        \/\/Precisamos fazer uma nova requisi\u00e7\u00e3o para recuperar \n        \/\/as informa\u00e7\u00f5es da pessoa atualizada\n        Person person2 = restTemplate.getForObject(BASE_PATH + &quot;\/&quot; +\n\t\t\tpersons.get(2).getIdPerson(), Person.class);\n       \n        \/\/Verificamos se o resultado da requisi\u00e7\u00e3o \u00e9 igual ao esperado\n        \/\/Se sim significa que tudo correu bem\n        Assert.assertNotNull(person2);\n    \tAssert.assertEquals(&quot;Tiago&quot;, person2.getFirstName());\n    \tAssert.assertEquals(&quot;Ferreira&quot;, person2.getLastName());\n        \n    }\n<\/pre>\n<p>Sendo assim nos testamos as opera\u00e7\u00f5es do nosso endpoint. Se quiser ver mais detalhes voc\u00ea pode <a href=\"https:\/\/github.com\/leandrocgsi\/spring-boot-rest-with-mongodb-example\/archive\/master.zip\">baixar o c\u00f3digo deste post aqui<\/a>, descompactar o arquivo zip e importar na sua IDE preferida ou clonar usando Git: <\/p>\n<p><\/br><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ngit clone https:\/\/github.com\/leandrocgsi\/spring-boot-rest-with-mongodb-example.git\n<\/pre>\n<p><\/br><\/p>\n<p>Voc\u00ea pode acessar outros posts sobre SpringBoot e REST aqui mesmo no blog.<\/p>\n<h2>Treinamentos relacionados com este post<\/h2>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_java\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0  AWS com Spring Boot 3, Java e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/07-rest-spring-java.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_microservices_java\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microservices do 0 com Spring Cloud, Spring Boot e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/14-microservices-java.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_kotlin\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0 AWS com Spring Boot 3, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/18-rest-spring-kotlin.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_ms_kotlin\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microsservi\u00e7os do 0 com Spring Cloud, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/22-ms-kotlin.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker do 0 \u00e0 Maestria: Cont\u00eaineres Desmistificados mais 3 B\u00d4NUS\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/09-docker.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker_para_aws\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker para Amazon AWS Implante Apps Java e .NET com Travis CI\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/10-docker-to-aws.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_kotlin\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Kotlin para DEVs Java: Aprenda a Linguagem Padr\u00e3o do Android\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/20-kotlin.png\" \/><br \/>\n    <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das principais caracter\u00edsticas do Spring Boot \u00e9 a sua simplicidade em permitir criar rapidamente uma aplica\u00e7\u00e3o sem abrir m\u00e3o do design do seu c\u00f3digo. E se voc\u00ea realmente quer fazer um trabalho de qualidade n\u00e3o pode abrir m\u00e3o dos testes. Um bom modo de se fazer isso \u00e9 com testes efetivos (n\u00e3o mocks) rodando [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[96,104,118],"tags":[221,231,245],"_links":{"self":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/1014"}],"collection":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1014"}],"version-history":[{"count":0,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/1014\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}