我想测试一个实时组件,它作为执行的结果在 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/