【发布时间】:2021-04-29 19:29:05
【问题描述】:
我正在为从 S3 触发的 AWS Lambda 实施 Java 8 包,获取一些文件数据并放入另一个 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 best practices white paper)。
但是,我很难知道如何通过伪造的 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?)
所以我的问题是,如何通过传递假的 S3Event JSON 来正确测试我的 run 函数?
这些是我正在使用的与 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);
}
但是这样做是最佳实践吗?
【问题讨论】:
-
您使用的是什么版本的 aws-lambda 库?
-
可以显示
s3-event.json的内容吗? -
在原问题中添加了aws相关的库
-
s3-event.json基本上是 PUT 示例的副本:docs.aws.amazon.com/AmazonS3/latest/dev/… -
@Sir.Hedgehog 因为泛型
标签: java amazon-web-services aws-lambda