问题描述
我只想使用@DataJpaTest 测试持久层,并且我有两个数据源配置,一个在 src/main 中,另一个是 src/test,并且我在测试数据源上使用 @primary 仅用于获取,但主要数据源也会被获取。
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...
}
}
src/测试配置
@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() {
}
}
解决方法
@AutoConfigureTestDatabase 的目的是将 src/main/.. 中定义的现有数据源替换为 src/test 中定义的数据源。但是要这样做,您必须通知它必须使用什么策略。您选择了 AutoConfigureTestDatabase.Replace.NONE
,因此它不会用您需要的数据源替换主数据源。
尝试切换到 AutoConfigureTestDatabase.Replace.ANY
,它会正确地将其替换为测试中定义的那个。
你也可能在文档中展示了这一点
在多个DataSource bean的情况下,只有@Primary 数据源被考虑。
这适用于您在项目中定义了多个数据源的情况。这意味着它将仅替换具有定义策略的主数据源。这并不意味着它会只选择主要的而忽略其他的。