2016-08-26 2 views
2

После поиска в Интернете для хорошего решения встроенного Java AWS S3, казалось, что S3Ninja и S3Proxy, казалось, были самыми популярными решениями.AWS S3 Java Embedded Mock для тестов интеграции

Однако, как представляется, нет простого способа запустить их программно. После отказа от S3Ninja я попытался сделать это с S3Proxy, но он не совсем работает.

зависимостями Maven

<dependency> 
    <groupId>org.gaul</groupId> 
    <artifactId>s3proxy</artifactId> 
    <version>${s3proxy.version}</version> 
    <scope>test</scope> 
</dependency> 

Код

String endpoint = "http://127.0.0.1:8085"; 
URI uri = URI.create(endpoint); 
Properties properties = new Properties(); 
properties.setProperty("s3proxy.authorization", "none"); 
properties.setProperty("s3proxy.endpoint", endpoint); 
properties.setProperty("jclouds.provider", "filesystem"); 
properties.setProperty("jclouds.filesystem.basedir", "/tmp/s3proxy"); 

ContextBuilder builder = ContextBuilder 
     .newBuilder("filesystem") 
     .credentials("x", "x") 
     .modules(ImmutableList.<Module>of(new SLF4JLoggingModule())) 
     .overrides(properties); 
BlobStoreContext context = builder.build(BlobStoreContext.class); 
BlobStore blobStore = context.getBlobStore(); 

S3Proxy s3Proxy = S3Proxy.builder().awsAuthentication("x", "x").endpoint(uri).keyStore("", "").blobStore(blobStore).build(); 
s3Proxy.start(); 

BasicAWSCredentials awsCredentials = new BasicAWSCredentials("x", "x"); 

AmazonS3Client client = new AmazonS3Client(awsCredentials, new ClientConfiguration()); 
client.setEndpoint(endpoint); 

// Should Throw AWS Client Exception as Bucket/Key does not exist! 
GetObjectRequest objectRequest = new GetObjectRequest("bucket", "key"); 
S3Object object = client.getObject(objectRequest); 

s3Proxy.stop(); 

Исключение

java.lang.NoSuchMethodError: com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.<init>(Lcom/google/gson/internal/ConstructorConstructor;Lcom/google/gson/FieldNamingStrategy;Lcom/google/gson/internal/Excluder;)V 

at org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory.<init>(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:116) 
at org.jclouds.json.config.GsonModule.provideGson(GsonModule.java:129) 

... 

at org.jclouds.providers.config.BindProviderMetadataContextAndCredentials.backend(BindProviderMetadataContextAndCredentials.java:84) 

... 

at org.jclouds.ContextBuilder.build(ContextBuilder.java:581) 

Любая помощь действительно провер eciated. Я уверен, что это большое требование для многих тестов интеграции Java, которые взаимодействуют с AWS S3.

+1

Если это интеграционный тест, разве вы не хотите, чтобы он разговаривал с реальным S3? – Rob

+0

На самом деле нет. Наши интеграционные тесты должны выполняться локально без каких-либо других приемов. Мы используем ActiveMQ для издевки SQS и встроенного Redis для ElasticCache. – ptimson

+1

@ptimson Чтобы поддержать комментарий Роба, ваша тестовая среда интеграции должна быть идентичной рабочей среде. Это больше похоже на среду разработчика, чем на интеграционную среду. Для тестирования используются макеты SQS-сервисов. Проверьте https://github.com/adamw/elasticmq – jbird

ответ

1

Просто прокомментируйте причину, потому что ваш проект использует противоречивую версию gson. Для деления S3Proxy требуется gson 2.5.