Probando mi función de AWS Lambda con una falsa S3Event

pavlos163:

Me estoy poniendo en práctica un paquete Java 8 para una Lambda AWS que se desencadena desde S3, obtiene algunos datos de archivo y pone en otro depósito de S3.

Este es mi actual 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;
    }
}

He movido la lógica de negocio a mi Runnerclase, por lo que puedo probar adecuadamente (después de la AWS Lambda mejores prácticas papel blanco ).

Sin embargo, estoy luchando para ver cómo me puede pasar una falsificación S3Eventponer a prueba mi runfunción.

Mi prueba actualmente es:

@Test
public void putsDataIntoS3() throws IOException {
    runner.run(new ObjectMapper().readValue(loadJsonFromFile("s3-event.json"), S3Event.class), context);

    assertTrue(true);
}

Donde loadJsonFromFileobtiene el recurso con el nombre de archivo que estoy pasando, lo convierte en un flujo de entrada y luego en una String.

Sin embargo, que se traduce en un error:

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?)

Así que mi pregunta es, ¿cómo puedo probar correctamente mi runfunción pasando falsa S3EventJSON?

Estas son las dependencias AWS-relacionados que estoy usando:

<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>

EDITAR:

Puedo utilizar la S3Event.parseJsonfunción como esta: También he visto la parseJsonfunción, y puedo utilizar de esta manera:

@Test
public void putsFilteredDataIntoS3() throws IOException {
    runner.run(new S3Event(S3Event.parseJson(loadJsonFromFile("s3-event.json")).getRecords()), context);

    assertTrue(true);
}

Pero está haciendo todo esto una buena práctica?

vlad324:

Puede utilizar la biblioteca Mockito y tratar de burlarse de este S3Event.

Otra opción para crear S3Eventa partir de JSON:

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

EDIT: tercera opción es para actualizar su aws-lambda-java-eventsversión 2.2.4, donde se añaden constructor por defecto para S3Eventlo que será capaz de deserializar así:

objectMapper.readValue(loadJsonFromFile("s3-event.json"), S3Event.class)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=178958&siteId=1
Recomendado
Clasificación