Spring Boot Test. Аннотация @DirtiesContext закрывает HikariPool

Я добавляю аннотацию @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, он закроет / уничтожит beans и выполнит обновление. Вам действительно нужен @DirtiesContext?

M. Deinum 30.03.2021 08:30

Причина, по которой я начал использовать @ DirtiesContext b / c Я вижу, что у меня запускается несколько задач планировщика одного и того же характера, тогда как мои тесты полагаются только на одну запланированную задачу, выполняемую постоянно, @ DirtiesContext, по-видимому, решает эту проблему. Хотя это сильно тормозит тесты.

Ihor M. 30.03.2021 15:49

Кажется, это неправильный инструмент для исправления этого. Почему запланировано даже несколько задач? Вы используете @SpringBootTest для тестов, которые на самом деле в нем не нуждаются? Используете ли вы @SpringBootTest в разных тестах с разными комбинациями экземпляров @MockBean?

M. Deinum 30.03.2021 16:03

Мне нужны аннотации @ SpringBootTest для каждого тестового класса, поскольку я тестирую свое приложение через уровень REST, а затем есть разделение на основе функциональной области. Я не использую @ MockBean, но у меня есть много @SpyBean, разбросанных по моим ИТ. Может ли это быть способствующим фактором?

Ihor M. 30.03.2021 17:39

Да, потому что каждая уникальная комбинация @SpringBootTest / @SpyBean приведет к запуску нового приложения. Итак, если у вас есть 3 теста с разными @SpyBean, приложение запустится 3 раза, что приведет к появлению нескольких слушателей в вашем случае.

M. Deinum 30.03.2021 17:54

Куда бы вы порекомендовали протолкнуть эти шпионские бобы? Может в общем классе @TestConfiguration? Каковы лучшие практики в таких обстоятельствах? Я хочу, чтобы приложение запускалось только один раз в ходе тестирования, а затем мне нужно было шпионить / издеваться над некоторыми из этих ИТ-систем?

Ihor M. 30.03.2021 18:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
6
24
0

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