所以,我现在正在进行集成测试,并且我想排除任何与数据库相关的内容(存储库将被嘲笑)。另外,我连接到 2 个数据库,所以我拥有:
@Configuration
@Configuration
我尝试过(并且之前工作过,当仅使用 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 {
//...
}
我可以通过模拟我不想启用的数据库的 bean 来使其工作。