Я реализую пакет Java 8 для AWS Lambda, который запускается из S3, получает некоторые файловые данные и помещает в другое ведро S3.
Это мой текущий Handler
:
public class Handler implements RequestHandler<S3Event, Void> {
private static final String TARGET_BUCKET = "some-bucket";
private AmazonS3Client s3Client = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
private Runner runner = new Runner(s3Client, TARGET_BUCKET);
@Override
public Void handleRequest(S3Event s3Event, Context context) {
runner.run(s3Event, context);
return null;
}
}
Я переместил бизнес-логику в свой Runner
класс, чтобы я мог ее правильно протестировать (следуя рекомендациям AWS Lambda о лучших практиках ).
Однако яя изо всех сил пытаюсь увидеть, как я могу передать поддельный S3Event
для проверки моей run
функции.
Мой тест в настоящее время:
@Test
public void putsDataIntoS3() throws IOException {
runner.run(new ObjectMapper().readValue(loadJsonFromFile("s3-event.json"), S3Event.class), context);
assertTrue(true);
}
Где loadJsonFromFile
получает ресурс симя файла, которое я передаю, преобразует его во входной поток, а затем в String
.
Однако это приводит к ошибке:
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.amazonaws.services.lambda.runtime.events.S3Event]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
Так что мой вопрос, как я могудолжным образом протестируйте мою run
функцию, передав ложную S3Event
JSON?
Это зависимости, связанные с aws, которые я использую:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.455</version>
</dependency>
РЕДАКТИРОВАТЬ:
Я могу использовать функцию S3Event.parseJson
следующим образом: я также видел функцию parseJson
и могу использовать ее следующим образом:
@Test
public void putsFilteredDataIntoS3() throws IOException {
runner.run(new S3Event(S3Event.parseJson(loadJsonFromFile("s3-event.json")).getRecords()), context);
assertTrue(true);
}
Но разве все это является лучшим опытом?