Implementando mock do Amazon AWS S3 no Java

Leonardo Giuliani
2 min readMay 27, 2021

--

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:

https://github.com/findify/s3mock

--

--

Leonardo Giuliani

Desenvolvedor, entusiasta e apaixonado por software e todo tipo de tecnologia. Pós-graduando de Engenharia de Software.