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 Runner
clase, 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 S3Event
poner a prueba mi run
funció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 loadJsonFromFile
obtiene 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 run
función pasando falsa S3Event
JSON?
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.parseJson
función como esta: También he visto la parseJson
funció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?
Puede utilizar la biblioteca Mockito y tratar de burlarse de este S3Event
.
Otra opción para crear S3Event
a 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-events
versión 2.2.4
, donde se añaden constructor por defecto para S3Event
lo que será capaz de deserializar así:
objectMapper.readValue(loadJsonFromFile("s3-event.json"), S3Event.class)