Implementando mock do Amazon AWS S3 no Java
Testes de integração completos são sempre trabalhosos de serem feitos e difíceis de representarem o cenário real em qualquer linguagem. Porém, estes testes são de suma importância, ainda mais quando não estamos lidando com APIs que não estão sob o nosso controle.
Se tratando de ferramentas como o armazenador de arquivos Amazon AWS S3, fica ainda mais difícil fazer um teste de integração completo, pois a empresa não disponibiliza instrumentos oficiais para realizar testes locais em suas APIs. Por este motivo, foram criadas algumas ferramentas não oficiais para realizar o mock das APIs Amazon AWS, e se tratando especificamente do AWS S3, a que mais utilizei e recomendo é a findify/s3mock.
Ferramenta s3mock
O s3mock é um biblioteca desenvolvida pela empresa Findify e é descrito da seguinte maneira pela documentação da própria ferramenta:
O s3mock é um serviço web que implementa AWS S3 API, que pode ser usado para teste local de seu código usando S3, mas sem atingir pontos de extremidade S3 reais.
Basicamente, o s3mock starta uma réplica de implementação do AWS S3 na memória da sua máquina, sendo perfeito pra uso em testes. O s3mock abrange as linguagens Java e Scala, possuindo as implementações de uso mais comum do AWS S3, como: create bucked, delete bucked, get object, put object, etc. Porém algumas implementações ainda não são suportadas pela biblioteca, como: checking authentication ou bucket policy.
Implementação
Adicione a o código abaixo a gerenciador de dependências do seu projeto:
Maven:
<dependency>
<groupId>io.findify</groupId>
<artifactId>s3mock_2.13</artifactId>
<version>0.2.6</version>
<scope>test</scope>
</dependency>
Gradle:
testImplementation "io.findify:s3mock_2.13:0.2.6"
Após adicionar a dependência, basta você vocês adicionar o código abaixo para que o s3mock inicie em memória:
S3Mock api = new S3Mock.Builder()
.withPort(8001)
.withInMemoryBackend()
.build();
api.start();
Exemplificando como ficaria um AmazonS3Client:
EndpointConfiguration endpoint = new EndpointConfiguration(
"http://localhost:8001", "us-west-2");AmazonS3Client client = AmazonS3ClientBuilder
.standard()
.withPathStyleAccessEnabled(true)
.withEndpointConfiguration(endpoint)
.withCredentials(new AWSStaticCredentialsProvider(
new AnonymousAWSCredentials()))
.build();client.createBucket("bucket-test");
client.putObject("bucket-test", "file", "content");
E para finalizar é sempre de bom tom finalizar o s3mock para evitar possíveis problemas.
api.shutdown();
Simples assim, com essa implementação já é possível testar com s3mock! ;-)
Conclusão
Em minha experiência de uso o s3mock atendeu muito bem as minhas necessidades, sendo rápido, fácil de se implementar e provém mais confiança em testes de integração que utilizem o armazenador de arquivos AWS S3 da Amazon.
Mais detalhes sobre o s3mock pode ser encontrados na documentação oficial da ferramenta: