{"componentChunkName":"component---src-templates-blog-post-js","path":"/kafka-test/","result":{"data":{"markdownRemark":{"html":"<h2 id=\"Introducao\" style=\"position:relative;\">Introdução<a href=\"#Introducao\" aria-label=\"Introducao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Nos artigos anteriores vimos como criar um <a href=\"https://programadev.com.br/kafka-producer-avro/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Produtor</a> e um <a href=\"https://programadev.com.br/kafka-consumer/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Consumidor</a> utilizando <strong>Kafka</strong>, agora vamos entender como podemos criar testes usando <strong>JUnit</strong> utilizando uma abordagem mais simplificada onde através do conceito de <strong>Ports and Adapters</strong> conseguimos injetar as dependências sem a necessidade de usar outras <em>libs</em> para “mockar” as classes.</p>\n<p>Criar testes para as aplicações nem sempre é algo trivial, principalmente em cenários onde há injeção de dependências, pensando nisso existem <em>libs</em> para lidar com isso, as mais utilizadas são <strong>Mockito</strong> e <strong>PowerMock</strong> porém mesmo usando essas <em>libs</em> as vezes nos encontramos com problemas de injeção de dependências ou dependências cíclicas que atrapalham em muito a criação e a manutenção de testes.</p>\n<p>Uma abordagem que simplificaria esses cenários seria a utilização de <strong>Ports and Adapters</strong> onde através de interfaces conseguimos criar os <strong>Adaptadores</strong> para as classes que são utilizadas na aplicação e também ganhamos flexibilidade para implementar os nossos <strong>Adaptadores</strong> que serão usados nos testes, ganhando assim desacoplamento e coesão.</p>\n<p>Também iremos utilizar a API de Mocks que o próprio <strong>Kafka</strong> fornece para fazer o mock de um cluster.</p>\n<h2 id=\"Testando-o-Producer\" style=\"position:relative;\">Testando o Producer<a href=\"#Testando-o-Producer\" aria-label=\"Testando o Producer permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>No projeto <a href=\"https://github.com/guilhermegarcia86/kafka-series/tree/tests/register\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Producer</a> será utilizado a classe <strong>MockProducer</strong> para simular o cluster <strong>Kafka</strong> que irá enviar a mensagem. Para começar iremos criar a classe de teste <strong>TaxpayerServiceTest</strong>.</p>\n<p>Para que possamos criar e manipular a injeção de dependência no teste é necessário alguns ajustes na classe <strong>TaxpayerService</strong>, primeiro será removido a anotação <code class=\"language-text\">@Autowired</code> do atributo <code class=\"language-text\">private Producer&lt;String, TaxPayer&gt; producer;</code> e passaremos para o construtor:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">Producer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> producer<span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Autowired</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">TaxpayerService</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@Qualifier</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"taxpayerProducer\"</span><span class=\"token punctuation\">)</span> <span class=\"token class-name\">Producer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> producer<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>producer <span class=\"token operator\">=</span> producer<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Essa alteração já basta para o nosso teste.</p>\n<p>Agora na classe de teste vamos nos concentrar em como usar a classe <strong>MockProducer</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">final</span> <span class=\"token class-name\">MockProducer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> mockProducer <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">MockProducer</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">StringSerializer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">KafkaAvroSerializer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Com essa configuração já temos em mãos uma instância de um <code class=\"language-text\">Producer</code> que a classe <strong>TaxpayerService</strong> necessita.</p>\n<p>Agora conseguimos chamar o método <em>send</em> da nossa classe de serviço passando o objeto <strong>TaxpayerDTO</strong>.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TaxpayerServiceTest</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">TaxpayerService</span> taxpayerService<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">MockProducer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> mockProducer<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Test</span>\n    <span class=\"token keyword\">void</span> <span class=\"token function\">sendMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">MockProducer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> mockProducer <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">MockProducer</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">StringSerializer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">KafkaAvroSerializer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        taxpayerService <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TaxpayerService</span><span class=\"token punctuation\">(</span>mockProducer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">TaxpayerDTO</span> taxpayerDTO <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TaxpayerDTO</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        taxpayerDTO<span class=\"token punctuation\">.</span><span class=\"token function\">setDocument</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"12345678901\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        taxpayerDTO<span class=\"token punctuation\">.</span><span class=\"token function\">setEmail</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fake@email.com\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        taxpayerDTO<span class=\"token punctuation\">.</span><span class=\"token function\">setName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"John Doe\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        taxpayerService<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>taxpayerDTO<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O teste passa com sucesso e temos a saída no console:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token number\">14</span>:20:24.700 <span class=\"token punctuation\">[</span>main<span class=\"token punctuation\">]</span> INFO com.irs.sender.business.consumer.KafkaConsumerService - Recebendo TaxPayer\nMandando mensagem para pessoa :: Person<span class=\"token punctuation\">(</span>name<span class=\"token operator\">=</span>Guilherme, <span class=\"token assign-left variable\">email</span><span class=\"token operator\">=</span>meuemail@email.com<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"Testando-o-Consumer\" style=\"position:relative;\">Testando o Consumer<a href=\"#Testando-o-Consumer\" aria-label=\"Testando o Consumer permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Para realizar o teste no projeto <a href=\"https://github.com/guilhermegarcia86/kafka-series/tree/tests/sender\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Consumer</a> será necessários algumas modificações mais profundas.</p>\n<p>A princípio nesse projeto havia um loop <code class=\"language-text\">while(true)</code> para ficar sempre processando as mensagens que estavam sendo recebidas porém essa abordagem é pouco problemática pois o processamento ficará sempre atrelado à <strong>thread main</strong>, um ponto levantado pelo <a href=\"https://github.com/pedrualves\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Pedro Alves</a>. Para resolver isso há várias abordagens mas como estamos usando um projeto <strong>Spring Boot</strong> podemos criar uma tarefa agendada e com isso teremos uma <strong>thread</strong> em paralelo sendo executada periodicamente.</p>\n<p>Para isso é necessário criar a configuração de um <strong>ThreadPoolTaskSchedulerConfig</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Configuration</span>\n<span class=\"token annotation punctuation\">@ComponentScan</span><span class=\"token punctuation\">(</span>basePackages <span class=\"token operator\">=</span> <span class=\"token string\">\"com.irs.sender.business.consumer\"</span><span class=\"token punctuation\">,</span> basePackageClasses <span class=\"token operator\">=</span> <span class=\"token class-name\">KafkaConsumerService</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ThreadPoolTaskSchedulerConfig</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Bean</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">ThreadPoolTaskScheduler</span> <span class=\"token function\">threadPoolTaskScheduler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">ThreadPoolTaskScheduler</span> threadPoolTaskScheduler <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ThreadPoolTaskScheduler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        threadPoolTaskScheduler<span class=\"token punctuation\">.</span><span class=\"token function\">setPoolSize</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        threadPoolTaskScheduler<span class=\"token punctuation\">.</span><span class=\"token function\">setThreadNamePrefix</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"KafkaScheduleService\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> threadPoolTaskScheduler<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Na classe <strong>KafkaConsumerService</strong> vamos alterar a injeção de dependência de atributo para construtor e adicionaremos a classe <strong>ThreadPoolTaskScheduler</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">Consumer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> kafkaConsumer<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">Email</span> email<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">ThreadPoolTaskScheduler</span> taskScheduler<span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Autowired</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">KafkaConsumerService</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@Qualifier</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"taxpayerConsumer\"</span><span class=\"token punctuation\">)</span> <span class=\"token class-name\">Consumer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> kafkaConsumer<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Email</span> email<span class=\"token punctuation\">,</span> <span class=\"token class-name\">ThreadPoolTaskScheduler</span> taskScheduler<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>kafkaConsumer <span class=\"token operator\">=</span> kafkaConsumer<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>email <span class=\"token operator\">=</span> email<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>taskScheduler <span class=\"token operator\">=</span> taskScheduler<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E removeremos a anotação <code class=\"language-text\">@PostConstruct</code> e o laço <code class=\"language-text\">while(true)</code> do método <em>receive</em> que ficará assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">receive</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">Consumer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> consumer <span class=\"token operator\">=</span> kafkaConsumer<span class=\"token punctuation\">;</span>\n\n    consumer<span class=\"token punctuation\">.</span><span class=\"token function\">subscribe</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Collections</span><span class=\"token punctuation\">.</span><span class=\"token function\">singleton</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">topic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n\n        consumer<span class=\"token punctuation\">.</span><span class=\"token function\">poll</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Duration</span><span class=\"token punctuation\">.</span><span class=\"token function\">ofMillis</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">record</span> <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n\n            log<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Recebendo TaxPayer\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token class-name\">TaxPayer</span> taxpayer <span class=\"token operator\">=</span> <span class=\"token keyword\">record</span><span class=\"token punctuation\">.</span><span class=\"token function\">value</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token class-name\">Person</span> person <span class=\"token operator\">=</span> <span class=\"token class-name\">Person</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">email</span><span class=\"token punctuation\">(</span>taxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">getEmail</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">name</span><span class=\"token punctuation\">(</span>taxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            email<span class=\"token punctuation\">.</span><span class=\"token function\">sendMessage</span><span class=\"token punctuation\">(</span>person<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        consumer<span class=\"token punctuation\">.</span><span class=\"token function\">commitSync</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> ex<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        log<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Erro ao processar mensagem\"</span><span class=\"token punctuation\">,</span> ex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E agora para que a tarefa seja agendada e rode do mesmo jeito como era executava antes em que estava sempre buscando as mensagens no <strong>Kafka</strong> iremos criar o método <em>init</em> com o <strong>Schedule</strong> e um <strong>CronTrigger</strong> indicando de quanto em quanto irá rodar:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@PostConstruct</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    taskScheduler<span class=\"token punctuation\">.</span><span class=\"token function\">schedule</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">receive</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CronTrigger</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"* * * * * *\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Após isso foi criada a classe de teste <strong>KafkaConsumerServiceTest</strong> e nela iremos configurar a classe <strong>MockConsumer</strong> que irá simular o cluster <strong>Kafka</strong> que irá receber a mensagem.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">MockConsumer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> consumer <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">MockConsumer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token class-name\">OffsetResetStrategy</span><span class=\"token punctuation\">.</span>EARLIEST<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsumer<span class=\"token punctuation\">.</span><span class=\"token function\">schedulePollTask</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n    consumer<span class=\"token punctuation\">.</span><span class=\"token function\">rebalance</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Collections</span><span class=\"token punctuation\">.</span><span class=\"token function\">singletonList</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">TopicPartition</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"taxpayer-avro\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    consumer<span class=\"token punctuation\">.</span><span class=\"token function\">addRecord</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">ConsumerRecord</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token string\">\"taxpayer-avro\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0l</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"key\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"11122233344\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"meuemail@email.com\"</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\">HashMap</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TopicPartition</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Long</span><span class=\"token punctuation\">></span></span> beginningOffsets <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HashMap</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbeginningOffsets<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">TopicPartition</span><span class=\"token punctuation\">(</span>TOPIC<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0l</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsumer<span class=\"token punctuation\">.</span><span class=\"token function\">updateBeginningOffsets</span><span class=\"token punctuation\">(</span>beginningOffsets<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsumer<span class=\"token punctuation\">.</span><span class=\"token function\">subscribe</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Collections</span><span class=\"token punctuation\">.</span><span class=\"token function\">singleton</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"taxpayer-avro\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Basicamente essa configuração é para simular um cluster <strong>Kafka</strong>, criar um <strong>Tópico</strong>, adicionar uma mensagem e subscrever no tópico.</p>\n<p>Fora isso a nossa classe de serviço possui em sua regra o envio de emails e podemos simular o envio de email bastando fazer um adaptador para a nossa interface <strong>Email</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">private</span> <span class=\"token class-name\">Email</span> email<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">prepareEmailMock</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\temail <span class=\"token operator\">=</span> person <span class=\"token operator\">-></span> <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Mandando email teste :: \"</span> <span class=\"token operator\">+</span> person<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E com isso podemos criar o nosso teste:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Test</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">testConsumer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    service<span class=\"token punctuation\">.</span><span class=\"token function\">receive</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Executando o teste termos como saída no console:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token number\">20</span>:29:45.000 <span class=\"token punctuation\">[</span>main<span class=\"token punctuation\">]</span> INFO com.irs.sender.business.consumer.KafkaConsumerService - Recebendo TaxPayer\nMandando email teste :: Person<span class=\"token punctuation\">(</span>name<span class=\"token operator\">=</span>Guilherme, <span class=\"token assign-left variable\">email</span><span class=\"token operator\">=</span>meuemail@email.com<span class=\"token punctuation\">)</span></code></pre></div>\n<p>O teste completo:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">KafkaConsumerServiceTest</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">MockConsumer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> consumer<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">KafkaConsumerService</span> service<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Email</span> email<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">ThreadPoolTaskScheduler</span> taskScheduler <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ThreadPoolTaskScheduler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> TOPIC <span class=\"token operator\">=</span> <span class=\"token string\">\"taxpayer-avro\"</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@BeforeEach</span>\n\t<span class=\"token keyword\">void</span> <span class=\"token function\">prepareConsumer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t\tconsumer <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">MockConsumer</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token class-name\">OffsetResetStrategy</span><span class=\"token punctuation\">.</span>EARLIEST<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">prepareEmailMock</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\tconsumer<span class=\"token punctuation\">.</span><span class=\"token function\">schedulePollTask</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n\t\t\tconsumer<span class=\"token punctuation\">.</span><span class=\"token function\">rebalance</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Collections</span><span class=\"token punctuation\">.</span><span class=\"token function\">singletonList</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">TopicPartition</span><span class=\"token punctuation\">(</span>TOPIC<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\tconsumer<span class=\"token punctuation\">.</span><span class=\"token function\">addRecord</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">ConsumerRecord</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span>TOPIC<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0l</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"key\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">prepareTaxpayerMock</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token class-name\">HashMap</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TopicPartition</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Long</span><span class=\"token punctuation\">></span></span> beginningOffsets <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HashMap</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tbeginningOffsets<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">TopicPartition</span><span class=\"token punctuation\">(</span>TOPIC<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0l</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tconsumer<span class=\"token punctuation\">.</span><span class=\"token function\">updateBeginningOffsets</span><span class=\"token punctuation\">(</span>beginningOffsets<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\tconsumer<span class=\"token punctuation\">.</span><span class=\"token function\">subscribe</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Collections</span><span class=\"token punctuation\">.</span><span class=\"token function\">singleton</span><span class=\"token punctuation\">(</span>TOPIC<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tservice <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">KafkaConsumerService</span><span class=\"token punctuation\">(</span>consumer<span class=\"token punctuation\">,</span> email<span class=\"token punctuation\">,</span> taskScheduler<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t<span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">void</span> <span class=\"token function\">prepareEmailMock</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\temail <span class=\"token operator\">=</span> person <span class=\"token operator\">-></span> <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Mandando email teste :: \"</span> <span class=\"token operator\">+</span> person<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\t\n\t<span class=\"token class-name\">TaxPayer</span> <span class=\"token function\">prepareTaxpayerMock</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"11122233344\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"meuemail@email.com\"</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Test</span>\n\t<span class=\"token keyword\">void</span> <span class=\"token function\">testConsumer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\t\tservice<span class=\"token punctuation\">.</span><span class=\"token function\">receive</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Conclusao\" style=\"position:relative;\">Conclusão<a href=\"#Conclusao\" aria-label=\"Conclusao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Aqui foi mostrado uma maneira de como podemos escrever alguns testes para os nossos consumidores e produtores de mensagens com <strong>Kafka</strong>. Também vimos que foi necessária algumas alterações no projeto para deixar mais fácil a escrita de testes e isso deve ser um ponto positivo na evolução de qualquer aplicação.\nO intuito desse artigo não é dizer que não é mais necessário usar frameworks para testes como <strong>Mockito</strong> mas sim mostrar que em muitos casos o uso indiscriminado deles acaba por deixar o projeto extremamente acoplado e dependente pois na maioria das vezes não é pensado em como fazer uma boa injeção de independência.</p>\n<h2 id=\"Codigo-fonte\" style=\"position:relative;\">Código fonte<a href=\"#Codigo-fonte\" aria-label=\"Codigo fonte permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O projeto está no <a href=\"https://github.com/guilhermegarcia86/kafka-series/tree/tests\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a></p>","fields":{"slug":"/kafka-test/"},"frontmatter":{"date":"11 de fevereiro de 2021","description":"Testando Producers e Consumers Kafka","title":"Testes no Kafka com JUnit","tags":["Kafka","JUnit","Java","Producer","Consumer"],"author":"Guilherme Alves","image":{"id":"e76d836d-99c5-57f7-9d46-2756013da785","publicURL":"/static/843689d77d844298cfd439c810a74c64/kafka-junit.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAC4jAAAuIwF4pT92AAACZUlEQVQ4y3VUXWhSYRg+13XTXRd1HdFF10ERBBEZCgM3LCUitaHmTOpi4h8UgkgjsBGVDUKZIGNNyWiVOBubLYdbEuKcI3G5jUJprh+bes55Oueox9+ew+G85/ue9/3e34+gaRrsy6Ipd6+177EgSRK1Wq2Hw4LgyQyJJzAPSZF9Fdrl7oPYL8EtUBRPIKvV/5KpBi8QCMDlcvH/7XtEU+F3fBlbllHsDF/HmuUOZtbnOww3FZLJJORyORQKBYLBIJ8CFiyHC7k0+woZ0XkUfZP4NT+H9OtpHHVdwb2Yt06kKV6pXC7DarVCo9Egm83CZrPBYDCgVCrVPawVC9gYEmFLNoRMcROn393FqZcGHPcocWRChqWdFO9p00uj0ch56Pf7IZFIODkSidQN/nwfRvrCWeSVV7H9LQdfag6jH57jmFuOw88uY2z1BWMJWIgucgoejwdqtRp2ux0CgQBerxdut7uVw73QG2QunWO8FOLryDB2b40AqTRuLD7BwXER7q9OgyxX4Hzo5BScTifMZjNnSCgUIhaLIRwOt3JY2cxhY+AicrJBfFdcQ25AAMRXoP44gQPjQrzNxdENrVYLqVTKGReLxVAqlYhGo60+/PH0EZblgwitLeDz+grGPs3g0GMxFKEHHVVuhuVwOKDT6VAoFKDX67kU5PP5ukGq3slIzE7hzNRtnPDdxMlJFSxLHpRr+40q03yVE4kE1zYqlYorCotisdgKmWveRih/q/v4sruNvcqfVmX7jCAbqslk4lulvQOIBouZFrIjTyRD6DfP3aC6eETPeNFUzyXRbwSpPgey+AdJXNLIMijPRQAAAABJRU5ErkJggg==","aspectRatio":1.4096916299559472,"src":"/static/843689d77d844298cfd439c810a74c64/0823f/kafka-junit.png","srcSet":"/static/843689d77d844298cfd439c810a74c64/c67b7/kafka-junit.png 320w,\n/static/843689d77d844298cfd439c810a74c64/d3930/kafka-junit.png 640w,\n/static/843689d77d844298cfd439c810a74c64/0823f/kafka-junit.png 1280w,\n/static/843689d77d844298cfd439c810a74c64/17523/kafka-junit.png 1747w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":7}},"pageContext":{"slug":"/kafka-test/","previous":{"fields":{"slug":"/kafka-streams/"},"frontmatter":{"title":"Kafka Streams com Java","date":"02 fev, 2021"}},"next":{"fields":{"slug":"/kafka-connector/"},"frontmatter":{"title":"Kafka Connector","date":"23 fev, 2021"}}}},"staticQueryHashes":["63159454"]}