Программно зарегистрируйте bean-компонент EmbeddedDatabaseAutoConfiguration внутри BeanDefinitionRegistryPostProcessor для использования встроенного Postgres.

Я регистрирую bean-компонент, но на него никогда не действуют.

Чего-то не хватает для обработки так же, как если бы аннотация присутствовала? Я бы не хотел объявлять аннотацию в тестовом классе.

The BeanDefinitionRegistryPostProcessorвыполнение:

      import io.zonky.test.db.config.EmbeddedDatabaseAutoConfiguration;
import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.PriorityOrdered;

@Configuration
public class MyFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {

        System.out.println("postProcessBeanDefinitionRegistry before");
        try {
            registry.getBeanDefinition("io.zonky.test.db.config.EmbeddedDatabaseAutoConfiguration");
        } catch (Exception e) {
            System.out.println("Annotation missing, try programmatically register ..");

            RootBeanDefinition beanDefinition = new RootBeanDefinition(EmbeddedDatabaseAutoConfiguration.class);
            beanDefinition.setScope("singleton");
            MutablePropertyValues values = new MutablePropertyValues();
            values.addPropertyValue("zonky.test.database.provider", "zonky");
            beanDefinition.setPropertyValues(values);


            registry.registerBeanDefinition("io.zonky.test.db.config.EmbeddedDatabaseAutoConfiguration", beanDefinition);
        }

        System.out.println("postProcessBeanDefinitionRegistry after");
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("postProcessBeanFactory before");
        beanFactory.getBeanDefinition("io.zonky.test.db.config.EmbeddedDatabaseAutoConfiguration");
        System.out.println("postProcessBeanFactory after");
    }
}

Текущий тестовый класс:

      @ActiveProfiles("test")
@SpringBootTest

// I'd like `AutoConfigureEmbeddedDatabase` to be programmatically enabled for all test classes, 
// rather than requiring declarative annotation
// If the annotation is provided, the test works fine
//@AutoConfigureEmbeddedDatabase(provider = AutoConfigureEmbeddedDatabase.DatabaseProvider.ZONKY)
public class ItemServiceTest {

  @Autowired private ItemService itemService;

  @Test
  void test_Create() {

    String text = "Initial value: " + new Date();
    ItemDTO itemDTO = new ItemDTO();
    itemDTO.setText(text);

    itemDTO = itemService.create(itemDTO);

    // assert something with itemDTO ..
  }
}

В журналах консоли ниже,EmbeddedDatabaseAutoConfigurationне действует в случае программного использования. Вместо этого обработка предполагает наличие невстроенной базы данных и начинает инициализацию.

Вывод консоли, когда аннотация объявлена ​​в тестовом классе:

      Finished Spring Data repository scanning in 35 ms. Found 1 JPA repository interfaces. []
postProcessBeanDefinitionRegistry before
Generic bean: class [io.zonky.test.db.config.EmbeddedDatabaseAutoConfiguration]; scope=singleton; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null
postProcessBeanDefinitionRegistry after
Replacing 'dataSource' DataSource bean with embedded version []
postProcessBeanFactory before
postProcessBeanFactory after
trationDelegate$BeanPostProcessorChecker : Bean 'io.zonky.test.db.config.EmbeddedDatabaseAutoConfiguration' of type [io.zonky.test.db.config.EmbeddedDatabaseAutoConfiguration$$EnhancerBySpringCGLIB$$c4933b50] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) []
o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default] []
org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.6.14.Final []
o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} []
i.z.t.d.p.embedded.EmbeddedPostgres      : Detected a Darwin aarch64 system []

Вывод консоли, когда аннотация не объявлена ​​в тестовом классе и программно пытается создать компонент Spring:

      Finished Spring Data repository scanning in 31 ms. Found 1 JPA repository interfaces. []
postProcessBeanDefinitionRegistry before
postProcessBeanDefinitionRegistry after
o.s.c.a.ConfigurationClassPostProcessor  : Cannot enhance @Configuration bean definition 'myFactoryPostProcessor' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'. []
postProcessBeanFactory before
postProcessBeanFactory after
o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default] []
org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.6.14.Final []
o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} []
com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting... []
com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization. []

Зависимости в build.gradle.kts:

      implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES))
implementation("org.springframework.boot:spring-boot-starter")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-test")

implementation("io.zonky.test:embedded-postgres:2.0.2")
implementation("io.zonky.test:embedded-database-spring-test:2.2.0")

0 ответов

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