Тест интеграции загрузки Spring завершился неудачно из-за отсутствия фабрики кроликов

У меня есть приложение, которое использует rabbitmq и потребляет сообщения. Я хочу написать интеграционный тест, чтобы проверить все возможности. Моя конфигурация ниже:

@SpringBootApplication(scanBasePackages = {"com.mysite.domaintools", "com.mysite.core",
        "com.mysite.database.repository"})
@EntityScan("com.mysite.database.domain")
@EnableMongoRepositories(basePackages = {"com.mysite.database.repository.mongo"})
@EnableJpaRepositories("com.mysite.database.repository") @EnableRabbit
public class DomaintoolsApplication {

    private static final String topicExchangeName = "mysite";

    private static final String queueName = Queues.DOMAINTOOLS.getName();


    @Bean Queue queue() {
        return new Queue(queueName, false);
    }

    @Bean TopicExchange exchange() {
        return new TopicExchange(topicExchangeName);
    }

    @Bean Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("domaintools.key.#");
    }

    @Bean SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
            MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(queueName);
        container.setMessageListener(listenerAdapter);
        return container;
    }

    @Bean MessageListenerAdapter listenerAdapter(DomainToolsRabbitReceiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }


    public static void main(String[] args) {
        SpringApplication.run(DomaintoolsApplication.class, args);
    }
}

Все нормально, когда я запускаю свое приложение, но когда я пытаюсь запустить следующий тест:

@RunWith(SpringRunner.class)
@DataJpaTest
//@SpringBootTest
public class DomainToolsWorkerIT {

    @Autowired
    private DomainRepository domainRepository;

    @Test
    public void test(){
        System.out.println("");
    }
}

Я получаю исключение, что фабрика кроличьих соединений не найдена! Но я не должен запускать его, потому что это должно делать весенняя загрузка. В нем говорится, что не найдено кандидатов для bean-компонента ConnectionFactory, ожидается хотя бы один. Как я могу написать тест в приложении, которое использует rabbitmq?

возможно, вам нужно добавить @EnableRabbit в свою конфигурацию и использовать эту конфигурацию в своем тесте

Lho Ben 08.12.2018 23:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 436
1

Ответы 1

Вам нужно аннотировать свой тестовый класс с помощью EnableRabbit:

и добавьте RabbitTemplate с его ConnectionFactory, используя другой фиктивный объект:

макет фабрики, подключения и канала.

@RunWith(SpringRunner.class)
@DataJpaTest
@SpringBootTest(classes = DomaintoolsApplication.class)
@EnableRabbit
public class DomainToolsWorkerIT {

    @Autowired
    private DomainRepository domainRepository;

         /**
         * Create test rabbit template to not load a real rabbitMQ instance.
         *
         * @return rabbit template.
         */
        @Bean
        public RabbitTemplate template() {
            return new RabbitTemplate(connectionFactory());
        }

        /**
         * Connection factory mock to create rabbit template.
         *
         * @return connection factory mock.
         */
        @Bean
        public ConnectionFactory connectionFactory() {
            ConnectionFactory factory = mock(ConnectionFactory.class);
            Connection connection = mock(Connection.class);
            Channel channel = mock(Channel.class);
            doReturn(connection).when(factory).createConnection();
            doReturn(channel).when(connection).createChannel(anyBoolean());
            doReturn(true).when(channel).isOpen();
            return factory;
        }

    @Test
    public void test(){
        System.out.println("");
    }
}

Спасибо, но эта конфигурация дает ошибку: java.lang.IllegalStateException: Ошибка конфигурации: найдено несколько объявлений @BootstrapWith для тестового класса [com.eye4fraud.domaintools.DomainToolsWorkerIT]: [@ org.springframework.test.context.BootstrapWith (value = class org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaT‌ estContextBootstrapp‌ er), @ org.springframework.test.context.BootstrapWith (значение = класс org.springframework.boot.test.context.SpringBootTestConpper)

avalon 09.12.2018 08:45

Также можно привести пример с импортом? Я не могу найти класс Channel с помощью метода createchannel

avalon 09.12.2018 08:52

Также я получаю java.lang.IllegalStateException: тестовые классы не могут включать методы @Bean

avalon 09.12.2018 08:53

Также после перемещения beans в конфигурационный bean: вызвано: org.mockito.exceptions.misusing.WrongTypeOfReturnValue: Connection $ MockitoMock $ 1579221884 не может быть возвращен createConnection () createConnection () должен возвращать соединение

avalon 09.12.2018 08:59

Другие вопросы по теме