Как смоделировать конечную точку Amazon SQS при тестировании приложения Camel - PullRequest
0 голосов
/ 26 июня 2018

Я пишу приложение Spring Boot, которое использует Camel для прослушивания очереди SQS. Определение маршрута:

from("aws-sqs://my-s3-notification-queue" +
    "?amazonSQSClient=#sqsClient" +
    "&deleteAfterRead=false")
    .unmarshal().json(JsonLibrary.Jackson, S3EventNotification.class)
    .bean(s3NotificationHandler);

sqsClient определяется как @Bean в файле @Configuration.

При выполнении тестов я хотел бы смоделировать конечную точку SQS, чтобы я не подключался к AWS. Как мне это сделать? Я пытался написать свои тесты как

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
@MockEndpoints
public class ApplicationTests {

    @Test
    public void contextLoads() {
    }

}

Это должно работать, если я правильно читаю документы, но все равно пытается подключиться к AWS. Чего мне не хватает?

Ответы [ 4 ]

0 голосов
/ 02 августа 2018

Camel имеет набор тестов junit, который поддерживает манипулирование этими конечными точками. http://camel.apache.org/camel-test.html

На самом деле мы используем Spock для модульного тестирования, и было довольно легко следовать той же схеме. Вот как выглядит установка:

   DefaultCamelContext context
   MessagePipeline messagePipeline
   MockEndpoint resultEndpoint
   ProducerTemplate producerTemplate
   def setupMessagePipeLine() {
        context = new DefaultCamelContext()
        context.addRoutes(messagePipeline)
        context.start()
        producerTemplate = context.createProducerTemplate()
        resultEndpoint = MockEndpoint.resolve(context, 'mock:log:out')
    }

Здесь MessagePipelines - это класс, который расширяет RouteBuilder, а путь ввода 'direct:start', вывод 'mock:log:out'. Надеюсь, это поможет.

0 голосов
/ 26 июня 2018

Вы можете использовать Localstack С его помощью вы можете смоделировать несколько сервисов AWS из локальной системы, не подключая AWS.

0 голосов
/ 09 июля 2018

Посмотрите здесь: http://people.apache.org/~dkulp/camel/aws-sqs.html Я также пытаюсь решить ту же проблему, но моя проблема более конкретна. Я не хочу говорить с aws во время тестирования. Поэтому я хочу использовать localstack, чтобы высмеивать ресурсы aws. Но не могу найти способ сделать это. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что маршруты верблюдов должны быть определены как: «aws-sqs: queuename ..», но когда я запускаю localstack, моя конечная точка очереди выглядит так: «http://localist:37010/queue/queuename".

0 голосов
/ 26 июня 2018

Не уверен, насколько мой ответ поможет вам, так как я не знаю apache camel . Я издеваюсь над HttpServletRequest объектом и предполагаю, что здесь можно использовать ту же концепцию.

Итак, в вашем тесте

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
@MockEndpoints
public class ApplicationTests {
    @Mock
    public MyRoute myRoute;

    @Before
    public void init() {  
       when(myRoute.configure()).thenReturn("what you are returning");
    }

    @Test
    public void contextLoads() {
    }
}

И ваш myRoute класс будет выглядеть примерно так:

class MyRoute{
  public void configure(){
    from("aws-sqs://my-s3-notification-queue" +
    "?amazonSQSClient=#sqsClient" +
    "&deleteAfterRead=false")
    .unmarshal().json(JsonLibrary.Jackson, S3EventNotification.class)
    .bean(s3NotificationHandler);
  }

}
...