После поиска в Интернете для хорошего решения встроенного 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.
Если это интеграционный тест, разве вы не хотите, чтобы он разговаривал с реальным S3? – Rob
На самом деле нет. Наши интеграционные тесты должны выполняться локально без каких-либо других приемов. Мы используем ActiveMQ для издевки SQS и встроенного Redis для ElasticCache. – ptimson
@ptimson Чтобы поддержать комментарий Роба, ваша тестовая среда интеграции должна быть идентичной рабочей среде. Это больше похоже на среду разработчика, чем на интеграционную среду. Для тестирования используются макеты SQS-сервисов. Проверьте https://github.com/adamw/elasticmq – jbird