2
組み込みJava AWS S3モックの良い解決策をインターネットで検索したところ、S3NinjaとS3Proxyが最も一般的なソリューションのようでした。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統合テストでは、これが大きな要件であると確信しています。
統合テストの場合は、実際のS3と通信する必要はありませんか? – Rob
本当はいいえ。私たちの統合テストは、他のコンポーネントの義務がなくてもローカルで実行できるはずです。 ActiveMQを使用してSQSをモックし、ElasticCacheにRedisを埋め込みました。 – ptimson
@ptimson Robのコメントをサポートするには、統合テスト環境を本番環境と同一にする必要があります。統合環境よりも開発環境に似ています。テストのための模擬SQSサービスがあります。 http://github.com/adamw/elasticmq – jbird