Amazon SNS Inline Java Подписка для тестирования - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу протестировать работающий компонент, который в результате выполнения отправляет сообщение в теме 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 и регистрация в ней тестового клиента, а затем получение результата с помощью опроса.

Есть ли более простой способ?

1 Ответ

0 голосов
/ 11 февраля 2019

Как я уже упоминал в этом вопросе, я создал очередь 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));
}

Если нет более простого решения без создания дополнительных ресурсов (очереди), это прекрасно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...