Spring boot 如何在@DataJpaTest中使用用户定义的数据库代理

Spring boot 如何在@DataJpaTest中使用用户定义的数据库代理,spring-boot,spring-boot-test,Spring Boot,Spring Boot Test,我们需要跟踪数据库指标,所以我们使用datasource代理来跟踪它,以便在spring boot项目中集成我们创建的自定义datasource 如下 当我们运行主应用程序时,会拾取数据源代理,但当我们使用@DataJpaTest时,它不会拾取。如何在JUNIT测试用例中启用数据源代理 编辑:: 使用SpringBeanPostProcessor配置代理数据源 @Slf4j @Configuration public class DataSourceBeanConfig implements B

我们需要跟踪数据库指标,所以我们使用datasource代理来跟踪它,以便在spring boot项目中集成我们创建的自定义datasource 如下

当我们运行主应用程序时,会拾取数据源代理,但当我们使用@DataJpaTest时,它不会拾取。如何在JUNIT测试用例中启用数据源代理

编辑::

使用Spring
BeanPostProcessor
配置代理数据源

@Slf4j
@Configuration
public class DataSourceBeanConfig implements BeanPostProcessor
{
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException
    {

        if (bean instanceof DataSource)
        {
            System.out.println("AfterInitialization : " + beanName);

            // use pretty formatted query with multiline enabled
            PrettyQueryEntryCreator creator = new PrettyQueryEntryCreator();
            creator.setMultiline(true);

            log.info("Inside Proxy Creation");

            SystemOutQueryLoggingListener listener = new SystemOutQueryLoggingListener();
            listener.setQueryLogEntryCreator(creator);

            return ProxyDataSourceBuilder.create((DataSource) bean).countQuery()
                    .name("MyDS").listener(listener).build();

        }
        return bean; // you can return any other object as well
    }
}

下面是我们需要创建TestConfiguration以在@DataJpaTest中使用的解决方案

@RunWith(SpringRunner.class)
@DataJpaTest
public class DataTestJPA
{

    @TestConfiguration
    static class ProxyDataSourceConfig implements BeanPostProcessor
    {
        public Object postProcessAfterInitialization(Object bean, String beanName)
                throws BeansException
        {

            if (bean instanceof DataSource)
            {
               return ProxyDataSourceBuilder
                            .create((DataSource) bean)
                            .countQuery()
                            .name("MyDS")
                            .build();
                // @formatter:on

            }
            return bean; // you can return any other object as well
        }
    }
}

首先,它应该是一个
@Configration
,而不是
@组件
@ConfigurationProperties
在这里实际上没有什么作用。但是,我建议不要这样包装它,而是使用一个
BeanPostProcessor
,它包装并替换
DataSource
。即使在包装之后,主程序也在使用代理,但是@DataJpaTest在包装之后没有使用什么?你应用我的评论了吗?我不明白你想用你的评论来解释什么。我已经根据评论更新了实现你建议的问题,即使现在我的JUNIT测试没有使用proxyI,我给出了2个建议,你把它们拼凑成了1个。它应该是一个常规类,并在您的一个配置文件中注册为
static
@Bean
。我仍然不确定这是否会检测到它,因为
@DataJpaTest
会对引导什么进行有根据的猜测。
@RunWith(SpringRunner.class)
@DataJpaTest
public class DataTestJPA
{

    @TestConfiguration
    static class ProxyDataSourceConfig implements BeanPostProcessor
    {
        public Object postProcessAfterInitialization(Object bean, String beanName)
                throws BeansException
        {

            if (bean instanceof DataSource)
            {
               return ProxyDataSourceBuilder
                            .create((DataSource) bean)
                            .countQuery()
                            .name("MyDS")
                            .build();
                // @formatter:on

            }
            return bean; // you can return any other object as well
        }
    }
}