在@SpringBootTest中禁用与数据库的连接

问题描述 投票:0回答:1

所以,我现在正在进行集成测试,并且我想排除任何与数据库相关的内容(存储库将被嘲笑)。另外,我连接到 2 个数据库,所以我拥有:

  • 具有 2 个数据库属性的 application.yml
  • 带有
    @Configuration
  • 的 FirstDatabaseConfiguration 类
  • 带有
    @Configuration
  • 的 SecondDatabaseConfiguration 类

我尝试过(并且之前工作过,当仅使用 1 个数据库时,在 application.yml 中配置它,没有 2 个 java 配置类)来执行此操作:

@ActiveProfiles("test")
@SpringBootTest
@EnableAutoConfiguration(exclude = {
    DataSourceAutoConfiguration.class,
    DataSourceTransactionManagerAutoConfiguration.class,
    HibernateJpaAutoConfiguration.class})

就像我说的,我记得它可以使用 1 个数据库,但现在使用 2 个数据库就不行了。我遇到的问题是它正在尝试从 FirstDatabaseConfiguration 和 SecondDatabaseConfiguration 加载

@Bean

还值得注意的是我正在使用配置文件。主要是,我有一个包含数据库秘密的

application-dev.yml
,在测试中我有一个包含其他秘密的
application-test.yml
。最近,由于这个问题,我也在那里添加了数据库机密,但没有实际值,只有空白字符串(
""
)。

有了这个并删除

@EnableAutoConfiguration(...)
部分,我就没有 bean 问题了,并且在尝试连接到数据库时失败(当然)。但它不会停止测试的执行,所以我现在正在运行它。

这很不理想,所以我想问:如何在排除数据库配置的情况下制作

@SpringBootTest
?排除
@AutoConfiguration
看起来很容易,但对于
@Configuration
就没那么容易了。如果我可以排除
FirstDatabaseConfiguration
SecondDatabaseConfiguration
,那么使用我之前展示的
@EnableAutoConfiguration(..)
设置应该没问题(也许?)。

src/main/resources/application.yml:

spring:
  profiles:
    active: dev
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  datasource:
    clients:
      jdbcUrl: jdbc:sqlserver://${secrets.db.clientes.host}:${secrets.db.clientes.port};databaseName=${secrets.db.clientes.database};TrustServerCertificate=True;
      username: ${secrets.db.clientes.user}
      password: ${secrets.db.clientes.password}
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
      hikari:
        read-only: true
    nexos:
      jdbcUrl: jdbc:sqlserver://${secrets.db.nexos.host}:${secrets.db.nexos.port};databaseName=${secrets.db.nexos.database};TrustServerCertificate=True;
      username: ${secrets.db.nexos.user}
      password: ${secrets.db.nexos.password}
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
      hikari:
        read-only: true
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.SQLServerDialect
    hibernate:
      ddl-auto: none

配置类(两者基本相同):

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    basePackages = "com.example.demo.repositories.client",
    entityManagerFactoryRef = "clientEntityManagerFactory",
    transactionManagerRef = "clientTransactionManager"
)
public class ClientesDatabaseConfiguration {

    @Primary
    @Bean(name = "clientDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.clients")
    public DataSource clienteDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "clientEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean clienteEntityManagerFactory(EntityManagerFactoryBuilder builder,
                                                                              @Qualifier("clientDataSource") DataSource dataSource) {
        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto", "none");

        return builder
            .dataSource(dataSource)
            .properties(properties)
            .packages("com.example.demo.db.client")
            .persistenceUnit("clients")
            .build();
    }

    @Primary
    @Bean(name = "clientTransactionManager")
    public PlatformTransactionManager clienteTransactionManager(@Qualifier("clientEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

测试:

@ActiveProfiles("test")
@SpringBootTest
@AutoConfigureMockMvc
public class IntegrationTests {
  //...
}
spring database spring-boot testing configuration
1个回答
0
投票

我可以通过模拟我不想启用的数据库的 bean 来使其工作。

© www.soinside.com 2019 - 2024. All rights reserved.