Я добавляю аннотацию @DirtiesContext
в свои интеграционные тесты, так как хочу, чтобы контекст приложения был перестроен с нуля.
Но это закрыло пул JDBC, и мой bean-компонент Liquibase не может быть создан.
Пожалуйста, см. Подробности в журналах.
Есть идеи, как это исправить?
2021-03-29 18:17:28.799 WARN [] 25836 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.DatabaseException: java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
2021-03-29 18:17:29.992 ERROR [] 25836 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.DatabaseException: java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1794)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
Причина, по которой я начал использовать @ DirtiesContext b / c Я вижу, что у меня запускается несколько задач планировщика одного и того же характера, тогда как мои тесты полагаются только на одну запланированную задачу, выполняемую постоянно, @ DirtiesContext, по-видимому, решает эту проблему. Хотя это сильно тормозит тесты.
Кажется, это неправильный инструмент для исправления этого. Почему запланировано даже несколько задач? Вы используете @SpringBootTest
для тестов, которые на самом деле в нем не нуждаются? Используете ли вы @SpringBootTest
в разных тестах с разными комбинациями экземпляров @MockBean
?
Мне нужны аннотации @ SpringBootTest для каждого тестового класса, поскольку я тестирую свое приложение через уровень REST, а затем есть разделение на основе функциональной области. Я не использую @ MockBean, но у меня есть много @SpyBean, разбросанных по моим ИТ. Может ли это быть способствующим фактором?
Да, потому что каждая уникальная комбинация @SpringBootTest
/ @SpyBean
приведет к запуску нового приложения. Итак, если у вас есть 3 теста с разными @SpyBean
, приложение запустится 3 раза, что приведет к появлению нескольких слушателей в вашем случае.
Куда бы вы порекомендовали протолкнуть эти шпионские бобы? Может в общем классе @TestConfiguration
? Каковы лучшие практики в таких обстоятельствах? Я хочу, чтобы приложение запускалось только один раз в ходе тестирования, а затем мне нужно было шпионить / издеваться над некоторыми из этих ИТ-систем?
Если не использовать
@DirtiesContext
, он закроет / уничтожит beans и выполнит обновление. Вам действительно нужен@DirtiesContext
?