@Primary 数据源未在测试中获取

问题描述

我只想使用@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 数据源被考虑。

这适用于您在项目中定义了多个数据源的情况。这意味着它将仅替换具有定义策略的主数据源。这并不意味着它会只选择主要的而忽略其他的。