Introdução
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.
Para a exemplificação, irei utilizar um repositório com alguns conceitos de clean architecture, onde possuímos as interfaces do domain que serão implementados na camada de infra.
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.
Seguimos com a estrutura do projeto:
Gerando os mocks
A interface que será gerada possui os seguintes métodos:
O primeiro passo para gerarmos o mock é rodar o comando abaixo, para instalar o cli do mockgen:
< 1.16
$ GO111MODULE=on go get github.com/golang/mock/mockgen@v1.6.0
> 1.16
$ go install github.com/golang/mock/mockgen@v1.6.0
Após instalado iremos rodar o comando para gerar os nossos mocks:
$ mockgen -source=./domain/car_storage.go -destination ./infra/mock/mock.go
Na tag source iremos informar o caminho da nossa interface e na destination (podemos destinar para qualquer pasta) onde irá ser gerado o arquivo contendo os mocks.
O arquivo gerado é composto pelos seguintes métodos:
- NewMock que criar uma instância;
- EXPECT que retorna os métodos do nosso Mock;
- Os métodos da interface em si que retornam os valores que desejamos.
Utilizando os mocks gerados
Após criar um arquivo _test e declarar nossa função, primeiro devemos instanciar nosso controller, este controller vem do package mock 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.
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.
- Return: recebe diretamente o que irá retornar;
- DoAndReturn: recebe uma função que irá fazer algo e depois retornar.
Aqui estão alguns exemplos que utilizei para mostrar cada método:
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.
Métodos extras
AnyTimes: após chamar este método, podemos utilizar quantas vezes quiser o nosso método
MaxTimes: máximo de vezes que o método pode ser chamado
MinTimes: minimo de vezes que o método pode ser chamado
Considerações finais:
Espero que tenham gostado, minhas redes estão no meu perfil do dev.to para quaisquer dúvidas ou informações!
Top comments (0)