Search code examples
springspring-bootrabbitmqintegration-testingspring-boot-test

Slow startup on spring integration test. Cause? Can't disable RabbitMQ


I'm struggling in a performance problem on startup with my integration tests.

I'm trying to mock the messaging of the system. To do that, I basically use @MockBean on my gateway and use @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}). Example:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyApplication.class)
@WebAppConfiguration
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
@ActiveProfiles("test")
@EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class})
public class MyTestIT {

These two configuration did the job very well, my tests run without problem and without any dependency with some external RabbitMQ.

But the startup time of the spring boot is very, very slow. It's about two minutes only in this part configuring SimpleMessageListenerContainer, AmqpInboundChannelAdapter, EventDrivenConsumer, RabbitExchangeQueueProvisioner, etc.

The log has some tips about what is the problem (I cut a lot of the messages, this is a sample):

2018-02-09 14:26:37.784  INFO [ms-project-name-service,,,] 13804 --- [           main] o.s.integration.channel.DirectChannel    : Channel 'ms-project-name-service:test:-1.channel2-output' has 1 subscriber(s).

2018-02-09 14:26:54.110  INFO [ms-project-name-service,,,] 13804 --- [           main] c.s.b.r.p.RabbitExchangeQueueProvisioner : declaring queue for inbound: channel1-input.anonymous.417FtxKTTce7-_IR0tGuNA, bound to: channel1-input

2018-02-09 14:27:00.147  INFO [ms-project-name-service,,,] 13804 --- [           main] o.s.c.stream.binder.BinderErrorChannel   : Channel 'ms-project-name-service:test:-1.channel1-input.anonymous.417FtxKTTce7-_IR0tGuNA.errors' has 2 subscriber(s).

2018-02-09 14:27:09.186  INFO [ms-project-name-service,,,] 13804 --- [ce7-_IR0tGuNA-1] o.s.a.r.l.SimpleMessageListenerContainer : Restarting Consumer@4f0ea6f8: tags=[{}], channel=null, acknowledgeMode=AUTO local queue size=0

The most strange is this one:

2018-02-09 14:58:42.783  WARN [ms-project-name-service,,,] 208 --- [geGeQP_9Li3Jg-1] o.s.a.r.l.SimpleMessageListenerContainer : Consumer raised exception, processing can restart if the connection factory supports it. Exception summary: org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connect

This last one seems that he is still trying to connect on a local RabbitMQ.

There are a lot of these messages on the log. I can't understand why this is still happening even with RabbitMQAutoConfiguration disabled. It's a mystery too how the spring is subscribing in a channel if there is no RabbitMQ to connect.


Solution

  • We had similar problem here and it was solved by changing the runner:

    @RunWith(SpringRunner.class)
    

    to

    @RunWith(SpringJUnit4ClassRunner.class)
    

    They seems like the same on the documentation, but really kickoff our test performance. Let me know if it work, I'm still looking into the documentation for more details.