Тестирование моей функции AWS Lambda с поддельным S3Event - PullRequest
0 голосов
/ 07 декабря 2018

Я реализую пакет 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);
}

Но разве все это является лучшим опытом?

1 Ответ

0 голосов
/ 07 декабря 2018

Вы можете использовать библиотеку Mockito и попытаться смоделировать это S3Event.

Другой вариант создания S3Event из JSON:

S3EventNotification notification = S3EventNotification.parseJson(loadJsonFromFile("s3-event.json"));
S3Event event = new S3Event(notification.getRecords());

РЕДАКТИРОВАТЬ: Третий вариант - обновить aws-lambda-java-events до версии 2.2.4, где они добавили конструктор по умолчанию для S3Event, чтобы вы могли десериализовать его следующим образом:

objectMapper.readValue(loadJsonFromFile("s3-event.json"), S3Event.class)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...