Как написать интеграционный тест для шаблона кролика с обратным вызовом подтверждения и возврата - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть издатель, который публикует сообщение для обмена, и связанный шаблон кролика настроен для подтверждения и обратного вызова.Я просто хотел бы знать, как мне написать интеграционный тест для этого класса, используя макет или любой другой фреймворк.

У меня есть издатель, который публикует сообщение для обмена, и связанный шаблон кролика настроен для подтверждения и возврата вызованазад.Я просто хотел бы знать, как мне написать интеграционный тест для этого класса, используя макет или любой другой фреймворк.

Код:


    @Configuration
    public class TopicConfiguration {

        private static final Logger LOGGER = LoggerFactory.getLogger(TopicConfiguration.class);

        @Autowired
        RabbitMqConfig rabbitMqConfig;

        @Autowired 
        EPPQ2Publisher eppQ2Publisher;


         /**
         * Caching connection factory 
         * @return CachingConnectionFactory
         */
        @Bean
        public CachingConnectionFactory cachingConnectionFactory() {
            CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(rabbitMqConfig.getPublisherHosts(),
                    rabbitMqConfig.getPublisherPort());
            cachingConnectionFactory.setUsername(rabbitMqConfig.getPublisherUsername());
            cachingConnectionFactory.setPassword(rabbitMqConfig.getPublisherPassword());
            cachingConnectionFactory.setVirtualHost("hydra.services");
            cachingConnectionFactory.createConnection();
            cachingConnectionFactory.setPublisherReturns(true);
            cachingConnectionFactory.setPublisherConfirms(true);
            cachingConnectionFactory.setConnectionNameStrategy(f -> "publisherConnection");
            return cachingConnectionFactory;
        }

        /**
         * Bean RabbitTemplate
         * @return RabbitTemplate
         */
        @Bean
        public RabbitTemplate template(
                @Qualifier("cachingConnectionFactory") CachingConnectionFactory cachingConnectionFactory) {
            final RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);
            rabbitTemplate.setMessageConverter(producerJackson2MessageConverter());
            RetryTemplate retryTemplate = new RetryTemplate();
            ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
            backOffPolicy.setInitialInterval(500);
            backOffPolicy.setMultiplier(10.0);
            backOffPolicy.setMaxInterval(10000);
            retryTemplate.setBackOffPolicy(backOffPolicy);
            rabbitTemplate.setRetryTemplate(retryTemplate);
            rabbitTemplate.setExchange(rabbitMqConfig.getPublisherTopic());
            rabbitTemplate.setUsePublisherConnection(true);
            rabbitTemplate.setMandatory(true);

            rabbitTemplate.setConfirmCallback((correlation, ack, reason) -> {
                if (correlation != null) {
                    LOGGER.info("Received " + (ack ? " ack " : " nack ") + "for correlation: " + correlation);
                    if (ack) {
                        // this is confirmation received..
                        // here is code to ack Q1. correlation.getId() and ack it !!
                        eppQ2Publisher.ackMessage(new Long(correlation.getId().toString()));
                    } else {
                        // no confirmation received and no need to do any thing for
                        // retry..
                    }
                }

            });
            rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
                LOGGER.error("Returned: " + message + "\nreplyCode: " + replyCode + "\nreplyText: " + replyText
                        + "\nexchange/rk: " + exchange + "/" + routingKey);
            });
            return rabbitTemplate;
        }

        /**
         * Bean Jackson2JsonMessageConverter
         * @return Jackson2JsonMessageConverter
         */
        @Bean
        public Jackson2JsonMessageConverter producerJackson2MessageConverter() {
            return new Jackson2JsonMessageConverter();
        }

    }

    ````java
    @Component
    public class EPPQ2PublisherImpl implements EPPQ2Publisher{
        @Autowired
        RabbitMqConfig rabbitMqConfig;

        @Autowired
        private RabbitTemplate rabbitTemplate;

        private Channel channel;

        /**
         * Method sendMessage for sending individual scrubbed and encrypted message to publisher queue (Q2).
         * @param msg - message domain object 
         * @param deliveryTag - is message delivery tag.        
         */
        @Override
        public void sendMessage(Message msg,Long deliveryTag) {
            rabbitTemplate.convertAndSend(rabbitMqConfig.getRoutingKey(), msg,new CorrelationData(deliveryTag.toString()));
        }

        /**
         * sendMessages for sending list of scrubbed and encrypted messages to publisher queue (Q2)
         * @param msgList - is list of scrubbed and encrypted messages
         * @param channel - is ampq client channel 
         * @param deliveryTagList - is list of incoming message delivery tags. 
         */
        @Override
        public void sendMessages(List<Message> msgList, Channel channel, List<Long>deliveryTagList) {
            if(this.channel == null) {
                this.channel = channel;
            }
            for (int i = 0 ; i < msgList.size(); i ++) {
                sendMessage(msgList.get(i),deliveryTagList.get(i));
            }
        }

        /**
         * Method ackMessage for sending acknowledgement to subscriber queue (Q1).
         * @param  deliveryTag - is deliveryTag for each individual message.
         */
        @Override
        public void ackMessage(Long deliveryTag)  { 
            try {
                channel.basicAck(deliveryTag, false);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

Может кто-нибудь направить меня со ссылкой или пример:доступно, что было бы здорово.Немного подойдет для тестирования юнит и интеграции шаблонов кролика с подтверждением и возвратом.

1 Ответ

0 голосов
/ 04 апреля 2019
...