<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daiene Lima</title>
    <description>The latest articles on DEV Community by Daiene Lima (@daienelima).</description>
    <link>https://dev.to/daienelima</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F488196%2Fba173ccf-1bf7-418c-b641-009033ce8dcb.jpeg</url>
      <title>DEV Community: Daiene Lima</title>
      <link>https://dev.to/daienelima</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daienelima"/>
    <language>en</language>
    <item>
      <title>Usando o ApacheBench (ab) para testes de carga simples</title>
      <dc:creator>Daiene Lima</dc:creator>
      <pubDate>Tue, 27 Sep 2022 23:07:12 +0000</pubDate>
      <link>https://dev.to/daienelima/usando-o-apachebench-ab-para-testes-de-carga-simples-c42</link>
      <guid>https://dev.to/daienelima/usando-o-apachebench-ab-para-testes-de-carga-simples-c42</guid>
      <description>&lt;h2&gt;
  
  
  O que é Apache Bench ?
&lt;/h2&gt;

&lt;p&gt;É uma ferramenta de benchmarking que mede o desempenho de um servidor web enviando varias solicitações HTTP e registrando métricas de latência e sucesso. &lt;br&gt;
O ApacheBench pode ajudá-lo a determinar quanto tráfego seu servidor HTTP pode sustentar antes que o desempenho diminua e definir linhas de base para tempos de resposta típicos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como instalar ?
&lt;/h2&gt;

&lt;p&gt;Nos servidores Mac e Linux ele vem instalado por padrão no pacote básico do sistema. &lt;br&gt;
No windows é necessário baixar e instalar &lt;br&gt;
link para &lt;a href="https://www.apachelounge.com/download/" rel="noopener noreferrer"&gt;download&lt;/a&gt;&lt;br&gt;
após a instalação é possível encontrar o executável na pasta &lt;br&gt;
apache\bin&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdmhg17b7locks9k89w3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdmhg17b7locks9k89w3.png" alt="Windonws"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Executando os testes
&lt;/h2&gt;

&lt;p&gt;Aqui temos alguns argumentos aceitos: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3759abo8f13g3hvnwdtg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3759abo8f13g3hvnwdtg.png" alt="Arumentos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basta executar o seguinte comando &lt;br&gt;
&lt;code&gt;ab -n 100 -c 10 https://www.google.com/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ao executar a instrução recebemos a métrica abaixo contendo algumas informações como: tempo de requisição, porcentagem de sucesso e etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxl03ytwer05swpncq56g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxl03ytwer05swpncq56g.png" alt="Resultado"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>apachebench</category>
      <category>api</category>
      <category>test</category>
      <category>load</category>
    </item>
    <item>
      <title> Http Client Api Java 11</title>
      <dc:creator>Daiene Lima</dc:creator>
      <pubDate>Fri, 19 Mar 2021 22:58:42 +0000</pubDate>
      <link>https://dev.to/daienelima/http-client-api-java-11-4igj</link>
      <guid>https://dev.to/daienelima/http-client-api-java-11-4igj</guid>
      <description>&lt;p&gt;Tem muito tempo que os desenvolvedores java sofrem para trabalhar com HTTP, se não fosse por meio de recursos externos essa solicitação ficava muito verbosa e cansativa. &lt;/p&gt;

&lt;p&gt;Mas nas ultimas release do java tivemos a inclusão da Api cliente padronizada que visa substituir o &lt;em&gt;HttpURLConnection&lt;/em&gt; que está presente no JDK desde os primeiros anos.&lt;/p&gt;

&lt;p&gt;A nova Api suporta HTTP/1.1 e HTTP/2. A versão mais recente do protocolo HTTP foi projetada para melhorar o desempenho geral do envio de solicitações e do recebimento de respostas de um servidor.&lt;br&gt;
Isso aconteceu através da introdução de varias alterações como:&lt;br&gt;
multiplexação de fluxo, compactação de cabeçalho e Push Promise.&lt;br&gt;
Além disso o novo HTPP suporta nativamente &lt;em&gt;webSockets&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ao contrário do HttpURLConnection, o &lt;em&gt;HttpClient&lt;/em&gt; fornece mecanismos de solicitação síncrona e assíncrona.&lt;/p&gt;
&lt;h2&gt;
  
  
  A API consiste em 3 classes principais:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HttpRequest&lt;/strong&gt; - representa a solicitação a ser enviada por meio do HttpClient&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HttpClient&lt;/strong&gt; - se comporta como um contêiner para informações de configuração comuns a várias solicitações&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HttpResponse&lt;/strong&gt; - representa o resultado de uma chamada HttpRequest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um exemplo simples&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var url = "https://postman-echo.com/get";
        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI(url))
                .GET()
                .build();

        HttpClient httpClient = HttpClient.newHttpClient();
        var response =
                httpClient.send(request, HttpResponse.BodyHandlers.ofString());
return  response.body();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurando Headers
&lt;/h2&gt;

&lt;p&gt;Podemos usar o &lt;em&gt;headers&lt;/em&gt; que recebe vários parâmetros ou &lt;em&gt;header&lt;/em&gt;&lt;br&gt;
que recebe apenas um parâmetro ambos os métodos são chave e valor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI(url))
                .header("Content-Type", "text/plain;charset=UTF-8")
                .GET()
                .build();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//varios headers
.headers("Content-Type", "application/json", "token", "dadda")
//apenas um header
.header(Content-Type", "application/json")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Requisição com corpo
&lt;/h2&gt;

&lt;p&gt;A nova API fornece várias implementações de &lt;em&gt;BodyProcessor&lt;/em&gt; prontas para usar, que simplificam a passagem do corpo da solicitação.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;StringProcessor&lt;/strong&gt; - (lê o corpo de uma String , criada com HttpRequest.BodyProcessor.fromString )&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;InputStreamProcessor&lt;/strong&gt; - (lê o corpo de um InputStream , criado com HttpRequest.BodyProcessor.fromInputStream )&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ByteArrayProcessor&lt;/strong&gt; - (lê o corpo de uma matriz de bytes, criada com HttpRequest.BodyProcessor.fromByteArray )&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FileProcessor&lt;/strong&gt; - (lê o corpo de um arquivo no caminho fornecido, criado com HttpRequest.BodyProcessor.fromFile )
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var url = "https://postman-echo.com/post";
        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI(url))
                .POST(HttpRequest.BodyPublishers.ofString("exemplo"))
                .build();

        HttpClient httpClient = HttpClient.newHttpClient();
        var response =
                httpClient.send(request, HttpResponse.BodyHandlers.ofString());

        return  response.body();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O client suporta todos os métodos HTTP, mas o construtor contém apenas esses métodos pré-definidos: GET(), POST(), DELETE(), e PUT(). Para criar uma solicitação com um método HTTP diferente, você precisa chamar method().&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    var request = HttpRequest.newBuilder(URI.create("https://postman-echo.com/headers"))
            .method("HEAD", BodyPublishers.noBody())
            .build();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurações disponíveis
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    var client = HttpClient.newBuilder()
            .authenticator(Authenticator.getDefault())
            .connectTimeout(Duration.ofSeconds(30))
            .cookieHandler(CookieHandler.getDefault())
            .executor(Executors.newFixedThreadPool(2))
            .followRedirects(Redirect.NEVER)
            .priority(1) 
            .proxy(ProxySelector.getDefault())
            .sslContext(SSLContext.getDefault())
            .version(HttpClient.Version.HTTP_2) 
            .sslParameters(new SSLParameters())
            .build();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por padrão, o cliente tenta abrir uma conexão HTTP / 2, se o servidor responder com HTTP / 1.1, o cliente retorna automaticamente para esta versão. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;connectTimeout()&lt;/strong&gt; - determina quanto tempo o cliente espera até que uma conexão possa ser estabelecida. Se a conexão não puder ser estabelecida, o cliente lançará uma &lt;em&gt;HttpConnectTimeoutExceptionexceção&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;executor()&lt;/strong&gt; - define o executor a ser usado para tarefas assíncronas e dependentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alguns dos métodos fornecidos na interface HttpResponse.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;body()&lt;/strong&gt; - retorna o corpo da resposta&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;headers()&lt;/strong&gt; - retorna os cabeçalhos de resposta&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;statusCode()&lt;/strong&gt; - retorna o código de status HTTP
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;version()&lt;/strong&gt; - retorna o protocolo HTTP
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solicitações assíncrona
&lt;/h2&gt;

&lt;p&gt;O novo HttpClient oferece duas possibilidades para enviar uma solicitação a um servidor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;send&lt;/strong&gt; de forma síncrona (bloqueia até que a resposta chegue)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sendAsync&lt;/strong&gt; de forma assíncrona (não espera pela resposta, sem bloqueio)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;o método &lt;em&gt;sendAsync&lt;/em&gt; retorna CompletableFeature  - para processar uma solicitação de forma assíncrona :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var url = "https://postman-echo.com/post";
        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI(url))
                .POST(HttpRequest.BodyPublishers.ofString("exemplo"))
                .build();

        HttpClient httpClient = HttpClient.newHttpClient();
        var response =
                httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println);
        return response;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>java</category>
      <category>httpclient</category>
      <category>api</category>
    </item>
    <item>
      <title>Mockito: como utilizar de maneira simples</title>
      <dc:creator>Daiene Lima</dc:creator>
      <pubDate>Tue, 09 Mar 2021 23:59:51 +0000</pubDate>
      <link>https://dev.to/daienelima/mockito-como-utilizar-de-maneira-simples-4h86</link>
      <guid>https://dev.to/daienelima/mockito-como-utilizar-de-maneira-simples-4h86</guid>
      <description>&lt;p&gt;Eu utilizo o &lt;em&gt;Mockito&lt;/em&gt; tem algum tempo e é uma ferramenta muito poderosa. Sem ele criar testes seria muito mais verboso e de certa forma complicado.&lt;br&gt;
Depois de entender bem o conceito e a forma de utilizar o desenvolvimento de testes fica muito mais rápido e assertivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Mockito?
&lt;/h2&gt;

&lt;p&gt;O Mockito é um framework de Test and Spy e o seu principal objetivo é simular a instancia de classes e comportamento de métodos. Ao mockar uma dependência com o mockito, eu faço com que a classe que vai ser testada simule o método testado e suas dependências. Durante o mock eu posso configurar retorno e ações de acordo com o necessidade do teste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais funções
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mock&lt;/strong&gt;: cria uma instancia de uma classe, porém Mockada. Se você chamar um metodo ele não irá chamar o metodo real, a não ser que você queira.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spy&lt;/strong&gt;: cria uma instancia de uma classe, que você pode mockar ou chamar os metodos reais. É uma alternativa ao InjectMocks, quando é preciso mockar metodos da propria classe que esta sendo testada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;InjectMocks&lt;/strong&gt;: criar uma intancia e injeta as dependências necessárias que estão anotadas com @Mock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify&lt;/strong&gt;: verifica a quantidade de vezes e quais parametros utilizados para acessar um determinado metodo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When&lt;/strong&gt;: Após um mock ser criado, você pode configurar ações na chamada e o retorno.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matchers&lt;/strong&gt;: permite a verificação por meio de matchers de argumentos (anyObject(), anyString() …)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Criando um mock
&lt;/h3&gt;

&lt;p&gt;Há duas formas de criar um mock usando o &lt;em&gt;mockito&lt;/em&gt; por meio de um método estático ou com a anotação @Mock&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilizando método statico
```
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;var EmployeeRepository = Mockito.mock(EmployeeRepository.class)&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* anotação @Mock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;@Mock&lt;br&gt;
private EmployeeRepository employeeRepository;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### Configurando a classe testada
Ao declarar a classe vamos anotar ela com @InjectMocks. O Mockito vai criar uma instância real dessa classe e injetar todos os objetos @ Mock que foram declarados na classe de teste.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;@InjectMocks&lt;br&gt;
private EmployeeController employeeController;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### Hibilitando as anotações
Para essas anotações @Mock e @InjectMocks funcionar, é preciso habilita-las. existem duas formas:
* Anotando a classe de teste com @RunWith(MockitoJUnitRunner.class)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;@RunWith(MockitoJUnitRunner.class)&lt;br&gt;
public class EmployeeControllerTest {}&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* Usando o MockitoAnnotations.initMocks () antes dos testes

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;@Before&lt;br&gt;
public void setup() {&lt;br&gt;
    MockitoAnnotations.initMocks(this);&lt;br&gt;
}&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
### Testando um metodo void
O método que vai ser testado:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;@DeleteMapping("/employees/{id}")&lt;br&gt;
public void deleteEmployee(@PathVariable Long id) {&lt;br&gt;
    repository.deleteById(id);&lt;br&gt;
}&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;O teste
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/test"&gt;@test&lt;/a&gt;&lt;br&gt;
public void deleteEmployee() {&lt;br&gt;
        employeeController.deleteEmployee(1L);&lt;br&gt;
    Mockito.verify(employeeRepository, Mockito.times(1)).deleteById(1L);&lt;br&gt;
}&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Primeiro chamamos o método que vai ser testado e passamos os 
parâmetros necessários.
Em seguida usamos o _Mockito.verify_ para verificar se durante a execução das classes mocadas foi chamado o método em questão.
Podemos verificar varias coisas com _Mockito.verify_ numero de vezes que executou, parâmetros recebidos e etc.

### @Spy Annotation
Usamos o @Spy para espionar uma instância existente.
No exemplo abaixo eu adicionei dois elementos a uma lista e em seguida verifiquei se os elementos foram mesmo inseridos.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/test"&gt;@test&lt;/a&gt;&lt;br&gt;
public void spyTest() {&lt;br&gt;
        List employees = Mockito.spy(new ArrayList());&lt;br&gt;
        Employee one = new Employee("Bilbo Baggins", "burglar");&lt;br&gt;
        Employee two = new Employee("Frodo Baggins", "thief");&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    employees.add(one);
    employees.add(two);

    Mockito.verify(employees).add(one);
    Mockito.verify(employees).add(two);
    assertEquals(2, employees.size());

    Mockito.doReturn(100).when(employees).size();
    assertEquals(100, employees.size());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* employees.add() para adicionar elementos a employees.
* employees.size() para retornar 100 em vez de 2 usando Mockito.doReturn()

### Método when
Através dele é possível simular chamadas a recursos externos a classe, como acesso a um banco de dados por exemplo, sem se preocupar como funcionará essa consulta, não é responsabilidade desse teste.
A sintaxe do when é essa:
* when(employeeRepository.save(Mockito.any(Employee.class))).thenReturn(employee);
* when(employeeRepository.save(Mockito.eq(employeeInput))).thenReturn(employee);
* when(employeeRepository.save(Mockito.any())).thenReturn(employee);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/test"&gt;@test&lt;/a&gt;&lt;br&gt;
public void newEmployee_test() {&lt;br&gt;
        Employee employee = EmployeeTest.create();&lt;br&gt;
        when(employeeRepository.save(Mockito.any(Employee.class))).thenReturn(employee);&lt;br&gt;
        ResponseEntity newEmployee = employeeController.newEmployee(employee);&lt;br&gt;
        assertEquals(employee.getName(), newEmployee.getBody().getName());&lt;br&gt;
        assertEquals(employee.getRole(), newEmployee.getBody().getRole());&lt;br&gt;
    }&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mukdycphq9tqiv813dcy.png)

[Repo com mais exemplos](https://github.com/daienelima/exemplo-HATEOAS)




&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>mockito</category>
      <category>java</category>
      <category>testing</category>
      <category>test</category>
    </item>
    <item>
      <title>Hypermedias com Spring HETEOAS</title>
      <dc:creator>Daiene Lima</dc:creator>
      <pubDate>Tue, 15 Dec 2020 02:56:54 +0000</pubDate>
      <link>https://dev.to/daienelima/hypermedias-com-spring-heteoas-554k</link>
      <guid>https://dev.to/daienelima/hypermedias-com-spring-heteoas-554k</guid>
      <description>&lt;h1&gt;
  
  
  O que é HATEOAS ?
&lt;/h1&gt;

&lt;p&gt;HATEOAS ou (Hypertext as the Engine of Application State) é um modelo que permite que você navegue  entre seus endpoints de forma dinâmica através de links e URLs e sem precisar do conhecimento prévio sobre a API. Nesse caso o cliente descobrirá as URLs  conforme navega entre seus recursos.&lt;/p&gt;

&lt;p&gt;Uma boa forma de comparação de HATEOAS é o Hypertext ou Hipertexto que é comum para quem navega na internet diariamente. Quando estamos pesquisando por algo na internet ou lendo alguma notícia e nos deparamos com alguma informação que nos direciona para outro link. &lt;br&gt;
O mesmo conceito pode ser aplicado a API em que a aplicação consumidora terá um link inicial e a partir dele terá acesso a outros recursos caso necessário. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Spring-HATEOAS é uma biblioteca de APIs que podemos usar para criar representações REST que seguem o padrão HATEOAS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos construir uma aplicação simples com o objetivo de mostrar as vantagens de usar o HATEOAS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primeiro adicionamos a dependência do spring-HATEOAS
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;             
   &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;spring-boot-starter-hateoas&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Criaremos um model
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Entity
public class Employee {

    private @Id @GeneratedValue Long id;
    private String name;
    private String role;

    public Employee() {}
    public Employee(String name, String role) {
        this.name = name;
        this.role = role;
    }
    //gets and sets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Depois vamos implementar a seguinte lógica no nosso controller
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.EntityModel;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.exception.EmployeeNotFoundException;
import com.example.demo.model.Employee;
import com.example.demo.repository.EmployeeRepository;

@RestController
public class EmployeeController {

    @Autowired
    private EmployeeRepository repository;


    @GetMapping("/employees")
    public ResponseEntity&amp;lt;CollectionModel&amp;lt;EntityModel&amp;lt;Employee&amp;gt;&amp;gt;&amp;gt; all() {

        List&amp;lt;EntityModel&amp;lt;Employee&amp;gt;&amp;gt; employees = repository.findAll().stream()
                .map(employee -&amp;gt; EntityModel.of(employee,
                        linkTo(methodOn(EmployeeController.class).one(employee.getId())).withSelfRel()))
                .collect(Collectors.toList());

        return ResponseEntity.ok(CollectionModel.of(employees));
    }

    @GetMapping("/employees/{id}")
    public ResponseEntity&amp;lt;EntityModel&amp;lt;Employee&amp;gt;&amp;gt; one(@PathVariable Long id) {

        Employee employee = repository.findById(id) 
                .orElseThrow(() -&amp;gt; new EmployeeNotFoundException(id));

        return ResponseEntity.of(Optional.of(EntityModel.of(employee, 
                linkTo(methodOn(EmployeeController.class).all()).withRel("employees"))));
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;strong&gt;methodOn()&lt;/strong&gt; obtém o mapeamento do método fazendo uma invocação fictícia do método de destino.&lt;br&gt;
O método &lt;strong&gt;linkTo()&lt;/strong&gt; inspeciona a classe do controlador e obtém seu mapeamento raiz e finalmente, o &lt;strong&gt;withSelfRel()&lt;/strong&gt; qualifica a relação como um link próprio.&lt;/p&gt;

&lt;p&gt;Nesse exemplo usamos o CollectionModel ele auxilia na criação de um wrapper para uma coleção de entidades.&lt;/p&gt;

&lt;h4&gt;
  
  
  No final temos o seguinte resultado
&lt;/h4&gt;

&lt;p&gt;Se listarmos todos os employees, ele vai retornar no json um link para acessar cada employee individualmente, caso seja necessário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zUIzkjBY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8ls3p21q28afgbu7dgf1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zUIzkjBY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8ls3p21q28afgbu7dgf1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se fizemos uma busca por apenas um employee ele nos retorna no json um link para acessar todos os employees&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wrTw624l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kg35ty9lzas3mp2w2ypq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wrTw624l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kg35ty9lzas3mp2w2ypq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse é um exemplo simples onde vemos que o cliente pode ter um único ponto de entrada para a aplicação e outras ações podem ser tomadas com base na resposta. &lt;br&gt;
Nessa aplicação eu mostrei como Spring HATEOAS promove a descoberta de API em um serviço rest.&lt;/p&gt;

&lt;p&gt;link do repositório com o código fonte &lt;a href="https://github.com/daienelima/exemplo-HATEOAS"&gt;projeto-exemplo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>hateoas</category>
      <category>springboot</category>
      <category>rest</category>
    </item>
    <item>
      <title>Como consumir uma API externa na sua aplicação Spring Boot</title>
      <dc:creator>Daiene Lima</dc:creator>
      <pubDate>Mon, 12 Oct 2020 19:03:49 +0000</pubDate>
      <link>https://dev.to/daienelima/como-consumir-uma-api-na-sua-aplicacao-spring-boot-3p3a</link>
      <guid>https://dev.to/daienelima/como-consumir-uma-api-na-sua-aplicacao-spring-boot-3p3a</guid>
      <description>&lt;p&gt;Em algum momento pode acontecer da nossa aplicação ter a necessidade de consumir ou se integrar com um serviço externo. &lt;br&gt;
Pensando nisso surgiu um projeto chamado Feign.&lt;/p&gt;
&lt;h1&gt;
  
  
  O que é Feign?
&lt;/h1&gt;

&lt;p&gt;O Feign é um projeto que está dentro do Spring Cloud ele é &lt;br&gt;
 utilizado para integração e consumo de serviços rest.&lt;/p&gt;

&lt;p&gt;Ele torna o consumo de clients de serviço da web mais fácil. Foi &lt;br&gt;
 inspirado no Retrofit e JAX-RS-2.0.&lt;br&gt;
 Uma grande facilidade do uso do Feign é que não precisamos &lt;br&gt;
 escrever nenhum código para chamar o serviço, a não ser uma &lt;br&gt;
 definição de interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@FeignClient&lt;/strong&gt; é a notação que torna o consumo do serviço &lt;br&gt;
 extremamente simples.&lt;/p&gt;

&lt;p&gt;Eu vou mostrar um exemplo simples consumindo a api &lt;br&gt;
 viacep.com.br/ws/{cep}/json/&lt;/p&gt;

&lt;p&gt;A api devolve um json na seguinte estrutura;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7rmunqlgxfd466v2lv5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7rmunqlgxfd466v2lv5t.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vamos adicionar duas dependências ao nosso pom.xml&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;spring-cloud-starter-openfeign&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-cloud-starter-openfeign&amp;lt;/artifactId&amp;gt;
    &amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;spring-cloud-dependencies&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;dependencyManagement&amp;gt;
        &amp;lt;dependencies&amp;gt;
            &amp;lt;dependency&amp;gt;
                &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;spring-cloud-dependencies&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;Hoxton.SR8&amp;lt;/version&amp;gt;
                &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
                &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
            &amp;lt;/dependency&amp;gt;
        &amp;lt;/dependencies&amp;gt;
    &amp;lt;/dependencyManagement&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Configurações do Projeto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Precisamos anotar  @EnableFeignClients na classe principal do &lt;br&gt;
  projeto, para habilitar o Feign, no caso aqui a classe &lt;br&gt;
  Application. &lt;br&gt;
  Com essa anotação habilitamos uma busca pela interface client &lt;br&gt;
  que devem ser consumida.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@SpringBootApplication
@EnableFeignClients
public class ConsumoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumoApplication.class, args);
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Criaremos a classe que vai retornar nosso objeto
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   public class Endereco {

    private String cep;
    private String logradouro;
    private String complemento;
    private String bairro;
    private String localidade;
    private String uf;
    private String ibge;
    private String gia;
    private String ddd;
    private String siafi;

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Criaremos uma interface onde o @FeignClient irá fazer a chamada do serviço.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os parâmetros url e name são obrigatórios;&lt;br&gt;
 onde url: é a base do serviço que vai ser consumido&lt;br&gt;
 e name: o nome do cliente&lt;br&gt;
 Precisamos dizer qual o Endepoint o buscarEnderecoPorCep vai &lt;br&gt;
 utilizar;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@FeignClient(url= "https://viacep.com.br/ws/" , name = "viacep")
public interface CepService {

    @GetMapping("{cep}/json")
    Endereco buscaEnderecoPorCep(@PathVariable("cep") String cep);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Agora é só criar a rota que usaremos para consumir o serviço;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@RestController
public class CepRestService {

    @Autowired
    private CepService cepService;

    @GetMapping("/{cep}")
    public ResponseEntity&amp;lt;Endereco&amp;gt; getCep(@PathVariable String cep) {

        Endereco endereco = cepService.buscaEnderecoPorCep(cep);

        return endereco != null ? ResponseEntity.ok().body(endereco) : ResponseEntity.notFound().build(); 
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, agora sua aplicação está consumindo um serviço externo &lt;br&gt;
 com poucas linhas e com o mesmo resultado que teríamos com &lt;br&gt;
 RestTemplate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fskt0a3a1jt9ng7a9ttuq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fskt0a3a1jt9ng7a9ttuq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link da aplicação modelo no git &lt;a href="https://github.com/daienelima/consumo" rel="noopener noreferrer"&gt;Exemplo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>api</category>
      <category>springboot</category>
      <category>feign</category>
    </item>
  </channel>
</rss>
