<?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: yuri</title>
    <description>The latest articles on DEV Community by yuri (@hyperyuri).</description>
    <link>https://dev.to/hyperyuri</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%2F726876%2F3353b991-061c-4784-a57d-48edff735fb1.jpeg</url>
      <title>DEV Community: yuri</title>
      <link>https://dev.to/hyperyuri</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hyperyuri"/>
    <language>en</language>
    <item>
      <title>Gerando mocks de interfaces no go!</title>
      <dc:creator>yuri</dc:creator>
      <pubDate>Wed, 10 Nov 2021 16:15:07 +0000</pubDate>
      <link>https://dev.to/hyperyuri/gerando-mocks-de-interfaces-no-go-2ano</link>
      <guid>https://dev.to/hyperyuri/gerando-mocks-de-interfaces-no-go-2ano</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Com a geração de mocks é possível aumentar a nossa produtividade na hora de escrever teste e também possuir uma melhor organização e padronização.&lt;/p&gt;

&lt;p&gt;Para a exemplificação, irei utilizar um repositório com alguns conceitos de &lt;a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html" rel="noopener noreferrer"&gt;clean architecture&lt;/a&gt;, onde possuímos as interfaces do domain que serão implementados na camada de infra.&lt;/p&gt;

&lt;p&gt;A ideia básica é que no domain possuímos nossas entidades que contêm a regra de negócio (estruturas e métodos), na camada de infra é onde iremos implementar os métodos do domain, e por fim os use cases que irão fazer a nossa regra girar para conversar com o resto da aplicação.&lt;/p&gt;

&lt;p&gt;Seguimos com a estrutura do projeto:&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%2Favuy8xgvxa8n6180qc5m.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%2Favuy8xgvxa8n6180qc5m.png" alt="Estrutura do projeto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerando os mocks
&lt;/h2&gt;

&lt;p&gt;A interface que será gerada possui os seguintes métodos:&lt;br&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%2Fblpea1pwuo3ixmefdju6.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%2Fblpea1pwuo3ixmefdju6.png" alt="Imagem da interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O primeiro passo para gerarmos o mock é rodar o comando abaixo, para instalar o cli do &lt;a href="https://github.com/golang/mock" rel="noopener noreferrer"&gt;mockgen&lt;/a&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  &amp;lt; 1.16
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ GO111MODULE=on go get github.com/golang/mock/mockgen@v1.6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  &amp;gt; 1.16
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ go install github.com/golang/mock/mockgen@v1.6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Após instalado iremos rodar o comando para gerar os nossos mocks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mockgen -source=./domain/car_storage.go -destination ./infra/mock/mock.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na tag &lt;strong&gt;&lt;em&gt;source&lt;/em&gt;&lt;/strong&gt; iremos informar o caminho da nossa interface e na &lt;strong&gt;&lt;em&gt;destination&lt;/em&gt;&lt;/strong&gt; (podemos destinar para qualquer pasta) onde irá ser gerado o arquivo contendo os mocks.&lt;/p&gt;

&lt;p&gt;O arquivo gerado é composto pelos seguintes métodos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NewMock que criar uma instância;&lt;/li&gt;
&lt;li&gt;EXPECT que retorna os métodos do nosso Mock;&lt;/li&gt;
&lt;li&gt;Os métodos da interface em si que retornam os valores que desejamos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Utilizando os mocks gerados
&lt;/h2&gt;

&lt;p&gt;Após criar um arquivo _test e declarar nossa função, primeiro devemos instanciar nosso controller, este controller vem do package &lt;a href="//github.com/golang/mock"&gt;mock&lt;/a&gt; e dentro deles passamos o nosso t (instância do tipo *testing.T), após isso devemos criar a nossa variável do mock passando este nosso controller que foi gerado.&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%2Fnk2ophoaogrqj7qfu2tl.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%2Fnk2ophoaogrqj7qfu2tl.png" alt="usando o mock"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para utilizarmos agora a nossa variável, iremos chamar o método EXPECT() e ele irá retornar os métodos da nossa interface. Após chamarmos o nosso método e passar o que ele espera, iremos decidir o que ele irá retornar em um dos 2 métodos abaixo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Return: recebe diretamente o que irá retornar;&lt;/li&gt;
&lt;li&gt;DoAndReturn: recebe uma função que irá fazer algo e depois retornar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui estão alguns exemplos que utilizei para mostrar cada método:&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%2Fet71caxxyacsz6gg5xaq.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%2Fet71caxxyacsz6gg5xaq.png" alt="Teste completo com o DoAndReturn"&gt;&lt;/a&gt;&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%2F1ez6ifdfo2uktdrgqify.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%2F1ez6ifdfo2uktdrgqify.png" alt="Teste completo com o Return"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vemos que o meu serviço recebe a minha instância mockada e após declararmos o que o nosso mock irá retornar, chamo o método Save do serviço que dentro do mesmo, irá chamar o método SaveCar da nossa instância mockada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métodos extras
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Times:&lt;br&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%2Fmiqt0d8sy2q7p9vobjh6.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%2Fmiqt0d8sy2q7p9vobjh6.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AnyTimes: após chamar este método, podemos utilizar quantas vezes quiser o nosso método&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MaxTimes: máximo de vezes que o método pode ser chamado&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MinTimes: minimo de vezes que o método pode ser chamado&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Considerações finais:
&lt;/h2&gt;

&lt;p&gt;Espero que tenham gostado, minhas redes estão no meu perfil do dev.to para quaisquer dúvidas ou informações!&lt;/p&gt;

&lt;h2&gt;
  
  
  Código fonte
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hyperyuri/go-mocking" rel="noopener noreferrer"&gt;GITHUB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>go</category>
      <category>testing</category>
      <category>mock</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
