我在使用集成测试时在启动时遇到了性能问题。
我试图嘲笑系统的消息。为此,我基本上在我的网关上使用@MockBean
并使用@EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class})
。例如:
@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 {
这两个配置完成了这项工作,我的测试运行没有问题,并且没有任何外部RabbitMQ的依赖。
但弹簧启动的启动时间非常非常慢。仅在配置SimpleMessageListenerContainer
,AmqpInboundChannelAdapter
,EventDrivenConsumer
,RabbitExchangeQueueProvisioner
等的此部分中大约需要两分钟。
日志中有一些关于问题的提示(我剪了很多消息,这是一个示例):
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
最奇怪的是这一个:
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
最后一个似乎他仍在尝试连接本地RabbitMQ。
日志上有很多这些消息。我无法理解为什么即使禁用RabbitMQAutoConfiguration仍然会发生这种情况。如果没有RabbitMQ连接,春天如何订阅频道也是一个谜。
答案 0 :(得分:3)
我们在这里有类似的问题,它通过改变跑步者来解决:
@RunWith(SpringRunner.class)
到
@RunWith(SpringJUnit4ClassRunner.class)
它们在文档中看起来是一样的,但真正启动了我们的测试性能。 如果有效,请告诉我,我仍然会查看文档以获取更多详细信息。
答案 1 :(得分:0)
在@Marco响应之后,在我删除了我的pom.xml的跟随依赖项之后问题又回来了(例如,它是我对<dependencies/>
的第一个依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-test-support</artifactId>
<scope>test</scope>
</dependency>
在返回依赖项后,问题就出现了问题。我改为SpringRunner.class
,测试仍然很快。我删除了依赖项,测试再次变慢了......
我认为这是一个与Spring相关的bug,它正在寻找类路径来进行自动配置。
顺便说一下,日志中的一些消息仍然会发生,但它们不会花这么长时间。