amazon-web-services - 用于测试的 Amazon SNS 内联 Java 订阅

标签 amazon-web-services amazon-sns aws-java-sdk

我想测试一个实时组件,它作为执行的结果在 SNS 主题中发送消息。

有没有办法使用 Java SDK 创建“内联”客户端订阅?

这行(伪代码):

@Test
public void testProcessingResult() throws Exception {
    final Box<Object> resultBox = new Box();
    snsClient.subscribe(new SubscribeRequest(topicArn, 
        msg -> resultBox.setValue(extractResult(msg))
    ));
    ...
    httpClient.post(endpoint, params); // send the request
    Thread.sleep(2000); // wait for eventual processing

    assertEquals(expected, resultBox.getValue());
}

实现此目的的一种方法是创建一个 Amazon SQS 队列并向其注册测试客户端,然后通过轮询获取结果。

有没有更简单的方法?

最佳答案

正如我在问题中提到的,我已经创建了一个 SQS 队列并将其订阅到 SNS 主题。然后我可以检查事件是否已发布。

private String subscriptionArn;
private String queueUrl;

@BeforeEach
public void createAndRegisterQueue() {
    queueUrl = sqs.createQueue("mytest-" + UUID.randomUUID()).getQueueUrl();
    subscriptionArn = Topics.subscribeQueue(sns, sqs, TOPIC_ARN, queueUrl);
}

@AfterEach
public void deleteAndUnregisterQueue() {
    sns.unsubscribe(subscriptionArn);
    sqs.deleteQueue(queueUrl);
}

@Test
public void testEventPublish() throws Exception {
    // request processing
    Response response = httpClient.execute(new HttpRequest(ENDPOINT));
    assertThat("Response must be successful.", response.statusCode(), is(200));

    // wait for processing to be completed
    Thread.sleep(5000);

    // check results
    Optional<String> published = sqs.receiveMessage(queueUrl).getMessages()
            .stream()
            .map(m -> new JSONObject(m.getBody()))
            .filter(m -> m.getString("TopicArn").equals(TOPIC_ARN))
            .map(m -> new JSONObject(m.getString("Message")))
            // ... filter and map the expected result
            .findAny();

    assertThat("Must be published.", published.isPresent(), is(true));
}

如果在不创建额外资源(队列)的情况下没有更简单的解决方案,则此方法可以正常工作。

关于amazon-web-services - 用于测试的 Amazon SNS 内联 Java 订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54575715/

相关文章:

android - 使用 AWS SNS 将仅通知负载发送到 GCM

java - 从 AWS Lambda 发布到 SNS 时超时

amazon-web-services - Spot实例支持DCOS

python - 超出 AWS Lambda 策略长度 - 向 lambda 函数添​​加规则

mysql - 连接亚马逊mysql数据库

amazon-web-services - AwsS3 客户端在初始化时抛出错误

amazon-web-services - 如何将查询中的所有结果获取到 aws dynamodb 表?

amazon-web-services - ECR 生命周期策略异常

ios - 使用Amazon AWS SNS服务IOS

c++ - AWS SNSClient 发布调用无法到达端点