У меня есть приложение, которое использует 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:
и добавьте 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)
Также можно привести пример с импортом? Я не могу найти класс Channel с помощью метода createchannel
Также я получаю java.lang.IllegalStateException: тестовые классы не могут включать методы @Bean
Также после перемещения beans в конфигурационный bean: вызвано: org.mockito.exceptions.misusing.WrongTypeOfReturnValue: Connection $ MockitoMock $ 1579221884 не может быть возвращен createConnection () createConnection () должен возвращать соединение
возможно, вам нужно добавить @EnableRabbit в свою конфигурацию и использовать эту конфигурацию в своем тесте