微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决@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 数据源被考虑。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。