<?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: Jonathas Garcia</title>
    <description>The latest articles on DEV Community by Jonathas Garcia (@jonathasgarcia).</description>
    <link>https://dev.to/jonathasgarcia</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F609713%2F9a94de7c-0a8a-4a37-9a9b-4602d5948b89.jpeg</url>
      <title>DEV Community: Jonathas Garcia</title>
      <link>https://dev.to/jonathasgarcia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jonathasgarcia"/>
    <language>en</language>
    <item>
      <title>Deploy de aplicação Quarkus no Kubernetes com LoadBalancer</title>
      <dc:creator>Jonathas Garcia</dc:creator>
      <pubDate>Sat, 14 Aug 2021 04:21:52 +0000</pubDate>
      <link>https://dev.to/jonathasgarcia/deploy-de-aplicacao-quarkus-no-kubernetes-com-loadbalancer-3k1f</link>
      <guid>https://dev.to/jonathasgarcia/deploy-de-aplicacao-quarkus-no-kubernetes-com-loadbalancer-3k1f</guid>
      <description>&lt;p&gt;Hoje em dia muito se fala em aplicações cloud native, quando falamos sobre este conceito nos referimos a aplicações containerizadas que são executadas em um ambiente de nuvem, escalável, com alta disponibilidade e tolerância a falhas. &lt;br&gt;
Muita das vezes nós desenvolvedores não estamos inseridos no contexto de infraestrutura da empresa em que trabalhamos, e com isso não temos a visão de como este universo funciona por debaixo dos panos, mas é de grande importância conhecermos estes conceitos, para desenvolver aplicações que sejam realmente escaláveis e de alta disponibilidade.&lt;/p&gt;

&lt;p&gt;Neste artigo vamos rodar uma aplicação com Framework Quarkus, utilizando Minikube para rodar Kubernetes localmente, e utilizar Nginx Ingress Controller para fazer o balanceamento de carga das requisições que nossa aplicação receber.&lt;/p&gt;

&lt;p&gt;Para este artigo é necessário que já tenha o conhecimento sobre o que são containers.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tecnologias
&lt;/h2&gt;

&lt;p&gt;Falando um pouco sobre a stack que utilizaremos neste artigo:&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Kubernetes ou k8s, é um orquestrador de container, ou seja, é o encarregado pelo gerenciamento dos containers da nossa aplicação, sendo responsável pela execução e monitoração dos nossos containers, e quando necessário, levantar novas instâncias da nossa aplicação. Neste artigo utilizaremos o Minikube que funciona como um Kubernetes local na sua máquina.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://www.redhat.com/en/topics/cloud-native-apps/what-is-quarkus" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Quarkus é um framework open source desenvolvido pela Red Hat. Pensado para aplicações Cloud native, o Quarkus trouxe inovações possibilitando o desenvolvimento de Aplicações em Java com baixo consumo de memória e rápida inicialização.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://helm.sh/" rel="noopener noreferrer"&gt;Helm&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Helm é um gerenciador de pacotes para aplicações projetadas para executar em cluster Kubernetes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Estrutura do Projeto
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Jonathas-garcia" rel="noopener noreferrer"&gt;
        Jonathas-garcia
      &lt;/a&gt; / &lt;a href="https://github.com/Jonathas-garcia/demo-quarkus-k8s" rel="noopener noreferrer"&gt;
        demo-quarkus-k8s
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;O projeto que executaremos possui uma proposta bem simples. Recebe uma requisição HTTP GET em um endpoint "/host" e responde um objeto contendo o nome da máquina em que ele está sendo executado, e a data e hora atual. Dessa forma conseguiremos verificar se o balanceamento de carga é realizado corretamente entre as instâncias que estarão em execução.&lt;/p&gt;

&lt;p&gt;Os arquivos referente a configuração do Helm estão dentro da pasta &lt;em&gt;"Helm"&lt;/em&gt;, nele temos os seguintes arquivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chart.yaml&lt;/strong&gt; - Contém as informações da aplicação como nome, descrição, tipo e versão.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;values.yaml&lt;/strong&gt; - Arquivo que contém os valores dos parâmetros que utilizaremos nos arquivos de "configuração" do Kubernetes. Nesse caso estamos especificando "replicaCount" que é a quantidade de instâncias da nossa aplicação, algumas informações referente ao container e seu repositório no dockerhub, e também informações de porta da aplicação. Essas informações são injetadas pelo Helm nos arquivos de template do Kubernetes que falaremos abaixo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para configurar nosso deploy temos os arquivos de templates do Kubernetes que está localizado na pasta &lt;em&gt;"helm/templates"&lt;/em&gt;, que contém a seguinte estrutura.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;deployment&lt;/strong&gt; - Contém o arquivo dp.yaml, que é um template do Kubernetes que utilizamos para especificar as informações da aplicação que será executada, como por exemplo, o nome da imagem, quantidade de instâncias e alguns metadados, como por exemplo a utilização de labels para identificar aplicações. Neste caso estamos definindo que nosso container executará a imagem jonathasgarcia/demo-quarkus-k8s, terá 4 instâncias e também definimos alguns outros metadados.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;service&lt;/strong&gt; - Contém o arquivo service.yaml, template do Kubernetes para criar um service, ou seja, estamos expondo nossa aplicação para acesso interno/externo. Neste caso, estamos especificando que quando nosso cluster Kubernetes receber uma requisição na porta 30081, a chamada será redirecionada para a porta 8080, que é a porta da nossa aplicação. &lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ingress&lt;/strong&gt; - Contém o arquivo ingress.yaml, arquivo para especificar o objeto ingress, responsável por gerenciar acessos externos as services que estão executando no nosso Kubernetes. Neste arquivo estamos definindo que as chamadas para a rota /app serão redirecionadas para a service que criamos acima. O Ingress também fica responsável por realizar o balanceamento de carga entre as instâncias disponíveis.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Importante relembrar neste ponto que estes arquivos no github não estão recebendo os valores diretamente, eles estão configurados para serem preenchidos pelo Helm de acordo com o arquivo values.yaml&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executando
&lt;/h2&gt;

&lt;p&gt;Inicialização do Minikube&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F2gd60c6fzzo9vn4upymu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F2gd60c6fzzo9vn4upymu.png" alt="image" width="710" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Habilitando ingress controller no Minikube&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube addons enable ingress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Fmrn89bky6jg19gejkgrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmrn89bky6jg19gejkgrg.png" alt="image" width="460" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criação namespace em que será executado nossa aplicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create namespace backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Fv65ma3suppavm51wat1x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fv65ma3suppavm51wat1x.png" alt="image" width="689" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Execução da aplicação pelo Helm&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm install --namespace backend demo-quarkus ./helm 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse comando definimos a instalação da nossa aplicação, passando em qual namepace será instalada, o nome da aplicação, e caminho da pasta que estão os arquivos de configuração.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjos376d60m7glx5hocta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjos376d60m7glx5hocta.png" alt="image" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos verificar as pods executando através do comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -n backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Fofai25zwqd4560js2kzj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fofai25zwqd4560js2kzj.png" alt="image" width="664" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para tornar o minikube acessível rode o seguinte comando em outro terminal, e o minikube disponibilizará um IP para acesso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube tunnel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Fd8dgx6ubkxwrfy2jcsyj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fd8dgx6ubkxwrfy2jcsyj.png" alt="image" width="619" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acessando 172.17.171.187:30081/host já temos acesso a aplicação via browser, mas nesse caso estamos acessando diretamente a service, sem passar pelo ingress controller, portanto se dermos alguns F5 na tela veremos que a informação de "hostname" não é alterada, pois o balanceamento de carga é realizado pelo ingress.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fh9vtkl9ratc88adiouw8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fh9vtkl9ratc88adiouw8.png" alt="image" width="550" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acessando 172.17.171.187/app/host temos acesso a aplicação passando pelo ingress controller, lembrando que configuramos o path "/app" para redirecionar para o service da nossa aplicação. Dessa forma então o ingress recebe a requisição e redireciona para nossa service, distribuindo cada requisição para cada uma das instâncias que estão em execução.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fcaj3k4uirbqneppnsxbj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fcaj3k4uirbqneppnsxbj.gif" alt="gif-loadbalancer" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Atualizando configurações via Helm
&lt;/h2&gt;

&lt;p&gt;Vamos supor que queremos diminuir a quantidade de instâncias de 4 para apenas 2. Essa informação é determinada pelo parâmetro "replicaCount" no nosso &lt;em&gt;values.yaml&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm upgrade demo-quarkus -n backend --set replicaCount=2 ./helm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Flzve8ljqz584gh0337d3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flzve8ljqz584gh0337d3.png" alt="image" width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma duas instâncias são finalizadas, e o balanceamento de carga é realizado apenas entre as duas que restaram. Podemos &lt;br&gt;
utilizar o &lt;em&gt;helm upgrade&lt;/em&gt; em qualquer cenário que nossa aplicação sofrerá alterações, seja em quantidades de instâncias ou até mesmo versão da imagem docker que será executada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Neste artigo tivemos o intuito de mostrar uma rápida configuração e deploy no Kubernetes. Não passamos por alguns conceitos básicos, que são primordiais que você aprenda nos estudos desta ferramenta. Essa é apenas a ponta do iceberg do que o Kubernetes e outras ferramentas podem nos proporcionar no contexto de aplicações cloud native, porém já vimos como ele pode nos ajudar a rodar aplicações escaláveis, com alta disponibilidade e tolerante a falhas&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>java</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Facilitando seus testes de integração em Java com TestContainers</title>
      <dc:creator>Jonathas Garcia</dc:creator>
      <pubDate>Wed, 07 Apr 2021 11:56:18 +0000</pubDate>
      <link>https://dev.to/jonathasgarcia/facilitando-seus-testes-de-integracao-em-java-com-testcontainers-2b70</link>
      <guid>https://dev.to/jonathasgarcia/facilitando-seus-testes-de-integracao-em-java-com-testcontainers-2b70</guid>
      <description>&lt;p&gt;Para maioria de nós desenvolvedores, escrever testes unitários é algo comum em nosso dia a dia. Seja para garantir a qualidade de nossos trechos de código, ou, para os menos exigentes, passar na cobertura mínima exigida pela esteira de CI/CD, desenvolver testes unitários é uma tarefa simples, mesmo para desenvolvedores com pouca experiência. &lt;/p&gt;

&lt;p&gt;Mas quando falamos sobre testes de integração há uma certa complexidade, principalmente quando nossas aplicações possuem &lt;strong&gt;dependências externas&lt;/strong&gt;, como, por exemplo, salvar registros em bancos de dados, enviar mensagens para um broker de mensageria, etc.&lt;/p&gt;

&lt;p&gt;A biblioteca &lt;a href="https://www.testcontainers.org/" rel="noopener noreferrer"&gt;TestContainers&lt;/a&gt; nos ajuda a resolver estas &lt;strong&gt;dependências externas&lt;/strong&gt;. Com a possibilidade de executar imagens docker durante a execução de nossos testes, podemos, por exemplo, subir uma instância de RabbitMq para que a nossa aplicação se conecte, e por fim a instância é finalizada após o término da execução dos testes.&lt;/p&gt;

&lt;p&gt;Neste artigo, veremos um exemplo de uma aplicação Spring que se conecta a um MongoDB para salvar registros através de um endpoint, e utilizaremos TestContainers para escrever nossos testes integrados. &lt;/p&gt;

&lt;p&gt;É necessário ter o docker instalado na máquina para seguir os passos deste artigo.&lt;/p&gt;

&lt;p&gt;Passaremos pelos principais pontos para utilização da biblioteca, o código pronto está disponível em: &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Jonathas-garcia" rel="noopener noreferrer"&gt;
        Jonathas-garcia
      &lt;/a&gt; / &lt;a href="https://github.com/Jonathas-garcia/poc-testcontainer" rel="noopener noreferrer"&gt;
        poc-testcontainer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Criação do projeto
&lt;/h2&gt;

&lt;p&gt;Para começar, crie uma nova aplicação Spring com as seguintes dependências:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Web, para criar um endpoint REST.&lt;/li&gt;
&lt;li&gt;Spring Data MongoDB, para a comunicação com o banco de dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Siga o exemplo do repositório e crie suas classes de model, repository, service e controller.&lt;/p&gt;

&lt;p&gt;Adicione a dependência do TestContainer no &lt;strong&gt;pom.xml&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;No pacote &lt;em&gt;test&lt;/em&gt; crie a classe &lt;strong&gt;MongoDbContainer&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Importante ressaltar neste ponto que poderíamos utilizar diretamente a classe MongoDBContainer, provido pelo TestContainer, conforme a &lt;a href="https://www.testcontainers.org/modules/databases/mongodb/" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt;, porém o intuito é também demonstrar a classe &lt;strong&gt;GenericContainer&lt;/strong&gt; pois com ela podemos referenciar a qualquer imagem pública, que neste caso referenciamos &lt;code&gt;mongo&lt;/code&gt; na sua versão &lt;code&gt;latest&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Também no pacote &lt;em&gt;test&lt;/em&gt;, crie a classe responsável por registrar e inicializar as properties para conexão com o banco.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;E então, crie sua classe de teste, executando a instância do MongoDB antes da execução dos testes no @beforeAll, e executando as chamadas HTTP's dentro do caso de teste.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;A chamada POST chamou o método do nosso controller que salva a mensagem no MongoDB, e realizando a chamada GET, garantimos que essa Mensagem foi salva, pois foi retornada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executando
&lt;/h2&gt;

&lt;p&gt;Na pasta do projeto execute os testes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./mvnw test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Biblioteca irá chamar o docker que executará o contêiner com a imagem do MongoDB.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fj7iukow6n8ydj5eq2a4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fj7iukow6n8ydj5eq2a4h.png" alt="Container mongo sendo executado" width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contêiner do TestContainer e do Mongo são iniciados no docker local.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhs7yxwwry0sptlsk1aql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhs7yxwwry0sptlsk1aql.png" alt="Containers executando" width="800" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aplicação é iniciada e abre conexão com a instância do banco de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fbu60n17pvjsh8ppdr2vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fbu60n17pvjsh8ppdr2vn.png" alt="Aplicação abre conexão com o banco" width="800" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Testes são executados com sucesso e os Contêineres são finalizados e removidos para evitar sujeira no disco.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fdiu78zlycxqpr4qxy0so.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fdiu78zlycxqpr4qxy0so.png" alt="Testes executados com sucesso" width="800" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Vimos que a biblioteca facilita nossos testes de integração, fornecendo instâncias de qualquer aplicação que possa ser executada em um contêiner docker. TestContainers ainda possui suporte para docker compose, trazendo mais possibilidades para seus testes.&lt;/p&gt;

</description>
      <category>java</category>
      <category>docker</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
