Spring @测试中未拾取主数据源
我只想使用@DataJpaTest测试持久层,我有两个数据源配置,一个在src/main中,另一个在src/test中,我只在test数据源上使用@primary来获取数据,但也获取主数据源 src/主配置Spring @测试中未拾取主数据源,spring,spring-boot,testing,junit4,junit5,Spring,Spring Boot,Testing,Junit4,Junit5,我只想使用@DataJpaTest测试持久层,我有两个数据源配置,一个在src/main中,另一个在src/test中,我只在test数据源上使用@primary来获取数据,但也获取主数据源 src/主配置 @Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = "com.****.repository", entityManagerFactoryRef
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.****.repository",
entityManagerFactoryRef = "platformEntityManagerFactory",
transactionManagerRef = "platformTransactionManager"
)
@Import(CommonPersistenceConfig.class)
public class PlatformPersistenceConfig {
@Value("classpath:application.yml")
private Resource resource;
@Bean
@Qualifier("platformTransactionManager")
public PlatformTransactionManager platformTransactionManager(@Qualifier("platformEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
// code...
}
@Bean
public LocalContainerEntityManagerFactoryBean platformEntityManagerFactory(DataSource dataSource,
HibernateProperties hibernateProperties) {
// code...
}
@Bean
public DataSource getDataSource() throws IOException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
// code...
}
}
@Configuration
@Import({CommonPersistenceConfig.class, DbPropertyConfig.class})
public class DbTestSetupConfig {
@Autowired
private TestDatasourceProperties dbProperties;
@Primary
@Bean(destroyMethod = "close")
public DataSource getDataSource() throws Exception {
// code...
}
@PostConstruct
public void dbSetup() throws Exception {
// code...
}
}
src/测试配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.****.repository",
entityManagerFactoryRef = "platformEntityManagerFactory",
transactionManagerRef = "platformTransactionManager"
)
@Import(CommonPersistenceConfig.class)
public class PlatformPersistenceConfig {
@Value("classpath:application.yml")
private Resource resource;
@Bean
@Qualifier("platformTransactionManager")
public PlatformTransactionManager platformTransactionManager(@Qualifier("platformEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
// code...
}
@Bean
public LocalContainerEntityManagerFactoryBean platformEntityManagerFactory(DataSource dataSource,
HibernateProperties hibernateProperties) {
// code...
}
@Bean
public DataSource getDataSource() throws IOException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
// code...
}
}
@Configuration
@Import({CommonPersistenceConfig.class, DbPropertyConfig.class})
public class DbTestSetupConfig {
@Autowired
private TestDatasourceProperties dbProperties;
@Primary
@Bean(destroyMethod = "close")
public DataSource getDataSource() throws Exception {
// code...
}
@PostConstruct
public void dbSetup() throws Exception {
// code...
}
}
我的测试
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class StripeCardRepositoryTest {
@Autowired
StripeCardRepository stripeCardRepository;
@Test
public void test() {
}
}
其要点是替换src/main/中定义的现有数据源。。使用src/test中定义的数据源。但要做到这一点,你必须告诉它必须使用什么策略。您选择了AutoConfigureTestDatabase.Replace.NONE
,因此它不会将主数据源替换为您需要的数据源
尝试切换到AutoConfigureTestDatabase.Replace.ANY
,它将正确地将其替换为测试中定义的数据库
也可能在文档中显示了这一点
对于多个数据源bean,只有@Primary
考虑了数据源
这适用于在项目中定义了多个数据源的情况。这意味着它将仅用定义的策略替换主数据源。这并不意味着它将只选择主数据库而忽略其他数据库。切换到任何后,它会给我错误“无法将数据源替换为用于测试的嵌入式数据库”您想做什么?你们有docker集装箱或类似的东西吗?为什么需要替换数据源?我有一个用于生产的数据库和另一个用于测试的数据库,分别是
@AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.replace.ANY,connection=EmbeddedDatabaseConnection.NONE)
@Boung实际上问题是通过@ContextConfiguration(classes=DbTestSetupConfig.class)解决的