2016-08-26 23 views
2

組み込みJava AWS S3モックの良い解決策をインターネットで検索したところ、S3NinjaS3Proxyが最も一般的なソリューションのようでした。AWS S3 Java組み込みモック統合テスト用

しかし、プログラムでこれらを起動する簡単な方法はないようです。 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) 

すべてのヘルプは本当にAPPRですeciated。 AWS S3とやりとりする多くのJava統合テストでは、これが大きな要件であると確信しています。

+1

統合テストの場合は、実際のS3と通信する必要はありませんか? – Rob

+0

本当はいいえ。私たちの統合テストは、他のコンポーネントの義務がなくてもローカルで実行できるはずです。 ActiveMQを使用してSQSをモックし、ElasticCacheにRedisを埋め込みました。 – ptimson

+1

@ptimson Robのコメントをサポートするには、統合テスト環境を本番環境と同一にする必要があります。統合環境よりも開発環境に似ています。テストのための模擬SQSサービスがあります。 http://github.com/adamw/elasticmq – jbird

答えて

1

理由は、あなたのプロジェクトがgsonの競合するバージョンを使用しているからです。 S3Proxyのdepはgson 2.5が必要です。

関連する問題